From 2080786285404ee09c3f1b26fcd1b41abfb113db Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 29 Jun 2021 10:25:03 +0200 Subject: [PATCH] Map abstraction and World class --- engine/entity.js | 12 ---- engine/falling_node.js | 20 +++---- engine/init.js | 33 +++++----- engine/item.js | 5 -- engine/item_entity.js | 6 +- engine/mainmenu.js | 60 +++++++------------ engine/map.js | 123 +++++++++++++++++++++++++++----------- engine/map_interaction.js | 84 ++++++++++---------------- engine/mapgen.js | 107 ++++++++++++++------------------- engine/node.js | 51 +++------------- engine/player.js | 64 ++++++++++---------- engine/schematic.js | 8 +-- engine/spawned_entity.js | 57 +++++++++--------- engine/world.js | 101 ++++++++++++++++++++++--------- game/chest/init.js | 12 ++-- game/commands/init.js | 10 ++-- game/core/init.js | 12 ++-- game/dirt/api.js | 16 ++--- game/doors/init.js | 72 +++++++++++----------- game/fire/init.js | 26 ++++---- game/furnace/itemdef.js | 12 ++-- game/plants/api.js | 44 +++++++------- game/tnt/init.js | 53 ++++++++-------- game/torch/init.js | 24 ++++---- game/wool/init.js | 2 +- index.html | 3 +- lib/dblib.js | 2 +- settings.json | 4 ++ 28 files changed, 514 insertions(+), 509 deletions(-) diff --git a/engine/entity.js b/engine/entity.js index b4799fd..89d9127 100644 --- a/engine/entity.js +++ b/engine/entity.js @@ -30,11 +30,6 @@ dragonblocks.Entity = class dragonblocks.entities[this.name] = this; dragonblocks.registeredEntities.push(this); } - - spawn(x, y) - { - return new dragonblocks.SpawnedEntity(this, x, y); - } }; dragonblocks.entities = {}; @@ -43,10 +38,3 @@ dragonblocks.registeredEntities = []; dragonblocks.registerEntity = def => { new dragonblocks.Entity(def); }; - -dragonblocks.spawnEntity = (name, x, y) => { - let def = dragonblocks.entities[name]; - - if (def) - return def.spawn(x, y); -}; diff --git a/engine/falling_node.js b/engine/falling_node.js index 13f2a6e..7853b06 100644 --- a/engine/falling_node.js +++ b/engine/falling_node.js @@ -28,33 +28,33 @@ dragonblocks.registerEntity({ height: 1, texture: this.texture, oncollide: self => { - let under = dragonblocks.getNode(Math.floor(self.x), Math.floor(self.y) + 1); + let under = self.map.getNode(Math.floor(self.x), Math.floor(self.y) + 1); if (! under || under.mobstable) { - dragonblocks.setNode(Math.floor(self.x), Math.floor(self.y), self.meta.nodeName); + self.map.setNode(Math.floor(self.x), Math.floor(self.y), self.meta.nodeName); self.despawn(); } } }); -dragonblocks.registerOnActivateNode((x, y) => { - let node = dragonblocks.getNode(x, y); +dragonblocks.registerOnActivate((map, x, y) => { + let node = map.getNode(x, y); if (! node.toNode().physics) return; - let under = dragonblocks.getNode(x, y + 1); + let under = map.getNode(x, y + 1); if (under && ! under.mobstable) - dragonblocks.spawnFallingNode(node.name, x, y) + dragonblocks.spawnFallingNode(node.name, map, x, y) }); -dragonblocks.spawnFallingNode = (nodename, x, y) => { +dragonblocks.spawnFallingNode = (nodename, map, x, y) => { setTimeout(_ => { - dragonblocks.map.activate(x, y); + map.activate(x, y); }, 50); - dragonblocks.setNode(x, y, "air"); + map.setNode(x, y, "air"); - let entity = dragonblocks.spawnEntity("dragonblocks:falling_node", x, y); + let entity = map.spawnEntity("dragonblocks:falling_node", x, y); entity.meta.nodeName = nodename; entity.texture = dragonblocks.nodes[nodename].texture; entity.updateTexture(); diff --git a/engine/init.js b/engine/init.js index 349d467..24d945a 100644 --- a/engine/init.js +++ b/engine/init.js @@ -116,28 +116,26 @@ loadingMods[modname] = false; }; - dragonblocks.start = selectedMods => { + dragonblocks.loadMods = selectedMods = _ => { + dragonblocks.loadedMods = {}; + + for (let mod in selectedMods) + if (selectedMods[mod]) + loadMod(mod); + + for (let mod in dragonblocks.gamemods) + loadMod(mod); + }; + + dragonblocks.start = worldProperties => { dragonblocks.log("Starting"); for (let func of dragonblocks.onStartCallbacks) func(); setTimeout(_ => { - dragonblocks.loadedMods = {}; - - for (let mod in selectedMods) - if (selectedMods[mods]) - loadMod(mod); - - for (let mod in dragonblocks.gamemods) - loadMod(mod); - - dragonblocks.map = new dragonblocks.Map(); - dragonblocks.map.load(); - - dragonblocks.player = new dragonblocks.Player(); - - dragonblocks.worldIsLoaded || dragonblocks.generateMap(); + dragonblocks.world = new dragonblocks.World(worldProperties); + dragonblocks.player = dragonblocks.world.player; for (let func of dragonblocks.onStartedCallbacks) func(); @@ -160,7 +158,8 @@ if (dragonblocks.loggedin) setTimeout(_ => { - dragonblocks.save(); + dragonblocks.player.despawn(); + dragonblocks.world.save(); location.reload(); }); else diff --git a/engine/item.js b/engine/item.js index b6ec460..63dc7a2 100644 --- a/engine/item.js +++ b/engine/item.js @@ -83,11 +83,6 @@ dragonblocks.registerItem = def => { new dragonblocks.Item(def); }; -dragonblocks.onUseItemCallbacks = []; -dragonblocks.registerOnUseItem = func => { - dragonblocks.onUseItemCallbacks.push(func); -}; - dragonblocks.itemMatch = (item1, item2) => { item1 = dragonblocks.items[item1] || dragonblocks.groups[item1] || item1; item2 = dragonblocks.items[item2] || dragonblocks.groups[item2] || item2; diff --git a/engine/item_entity.js b/engine/item_entity.js index e263565..bd1b07b 100644 --- a/engine/item_entity.js +++ b/engine/item_entity.js @@ -28,7 +28,7 @@ dragonblocks.registerEntity({ gravity: true, verticalSpeed: 2, onpunch: self => { - dragonblocks.dropItem(dragonblocks.player.give(self.meta.itemstring), self.x, self.y); + dragonblocks.dropItem(dragonblocks.player.give(self.meta.itemstring), self.map, self.x, self.y); self.despawn(); }, oncollide: self => { @@ -36,11 +36,11 @@ dragonblocks.registerEntity({ }, }); -dragonblocks.dropItem = (itemstack, x, y) => { +dragonblocks.dropItem = (itemstack, map, x, y) => { if (! itemstack || ! itemstack.item || ! itemstack.count) return; - let entity = dragonblocks.spawnEntity("dragonblocks:item_entity", x, y); + let entity = map.spawnEntity("dragonblocks:item_entity", x, y); entity.meta.itemstring = itemstack.serialize(); entity.texture = itemstack.toItem().texture; entity.updateTexture(); diff --git a/engine/mainmenu.js b/engine/mainmenu.js index 0451588..a4ba2f0 100644 --- a/engine/mainmenu.js +++ b/engine/mainmenu.js @@ -40,8 +40,6 @@ splash.style.color = "yellow"; splash.style.fontSize = "30px"; - let splashes = $.getJSON("splashes.json").responseJSON; - let status = center.appendChild(document.createElement("h1")); status.style.fontSize = "50px"; status.style.display = "none"; @@ -59,11 +57,15 @@ elem.remove(); }; + let worlds; + // Load World Button { let loadWorldGUI, worldlistDisplay, noWorldsNotice; + let worldProperties = new dragonblocks.World.Properties(true); + if (dragonblocks.loggedin) { onReload.push(_ => { if (loadWorldGUI) { @@ -80,10 +82,10 @@ worldlistDisplay = loadWorldGUI.create("ul"); } - noWorldsNotice.innerHTML = dragonblocks.worlds.length == 0 ? "No Worlds" : ""; + noWorldsNotice.innerHTML = worlds.length == 0 ? "No Worlds" : ""; - for (let worldname in dragonblocks.worlds) { - let world = dragonblocks.worlds[worldname]; + for (let worldname in worlds) { + let world = worlds[worldname]; if (world.owned) { let worldDisplay = worldlistDisplay.appendChild(document.createElement("li")); @@ -100,13 +102,8 @@ event.srcElement.blur(); loadWorldGUI.close(); - dragonblocks.worldIsLoaded = true; - dragonblocks.worldname = world.name; - dragonblocks.world = $.getJSON("worlds/" + worldname + "/world.json").responseJSON; - - dragonblocks.mods = dragonblocks.world.mods; - - dragonblocks.start(); + worldProperties.name = world.name; + dragonblocks.start(worldProperties); }); } } @@ -128,7 +125,7 @@ let createWorldGUI = new dragonblocks.gui.Box(); let createButton; - let worldProperties = {}; + let worldProperties = new dragonblocks.World.Properties(false); let headline = createWorldGUI.create("h1"); headline.innerHTML = "New World"; @@ -147,21 +144,21 @@ worldnameAlert.style.left = "50px"; worldnameInput.addEventListener("input", _ => { - let worldname = worldnameInput.value; + worldProperties.name = worldnameInput.value; - if(! dragonblocks.loggedin) { + if (! dragonblocks.loggedin) { worldnameAlert.textContent = "Warning: You are not logged in and cannot save worlds."; worldnameAlert.style.color = "#FF7D00"; createButton.disabled = false; - } else if (worldname == "") { + } else if (worldProperties.name == "") { worldnameAlert.textContent = ""; createButton.disabled = true; - } else if (! dragonblocks.checkWorldnameSpelling(worldname)) { + } else if (! worldProperties.checkSpelling()) { worldnameAlert.textContent = "The world name contains forbidden characters"; worldnameAlert.style.color = "#FF001F"; createButton.disabled = true; - } else if (dragonblocks.worlds[worldname]) { - if (dragonblocks.worlds[worldname].owned) { + } else if (worlds[worldProperties.name]) { + if (worlds[worldProperties.name].owned) { worldnameAlert.textContent = "Warning: This will overwrite an existing world"; worldnameAlert.style.color = "#FF7D00"; createButton.disabled = false; @@ -174,13 +171,9 @@ worldnameAlert.textContent = ""; createButton.disabled = false; } - - worldProperties.worldname = worldname; }); // Mods - worldProperties.mods = {}; - createWorldGUI.create("h2").innerHTML = " Mods"; let modlistDisplay; @@ -217,8 +210,6 @@ }; // Gamemode - worldProperties.gamemode = "survival"; - createWorldGUI.create("h2").innerHTML = " Gamemode"; for (let gamemode of ["survival", "creative"]){ @@ -246,6 +237,7 @@ let selectMapgen = createWorldGUI.create("select"); selectMapgen.style.position = "relative"; selectMapgen.style.left = "40px"; + selectMapgen.value = worldProperties.mapgen; selectMapgen.addEventListener("input", _ => { worldProperties.mapgen = selectMapgen.value; @@ -254,8 +246,6 @@ for (let mapgen in dragonblocks.mapgen.list) selectMapgen.appendChild(document.createElement("option")).innerHTML = mapgen; - worldProperties.mapgen = selectMapgen.value; - createWorldGUI.create("br"); createWorldGUI.create("br"); @@ -272,15 +262,7 @@ event.srcElement.blur(); createWorldGUI.close(); - dragonblocks.worldIsLoaded = false; - dragonblocks.worldname = worldProperties.worldname; - dragonblocks.world = dragonblocks.getEmptyWorld(); - - dragonblocks.entities["dragonblocks:player"].meta.creative = (worldProperties.gamemode == "creative"); - - dragonblocks.mapgen.selected = worldProperties.mapgen; - - dragonblocks.start(worldProperties.mods); + dragonblocks.start(worldProperties); }); createWorldGUI.create("br"); @@ -370,7 +352,7 @@ text: "Quit", action: _ => { if (dragonblocks.isChromeApp) - window.close(); + close(); else history.back(); }, @@ -399,7 +381,7 @@ dragonblocks.enterMainMenu = _ => { dragonblocks.loadModList(); - dragonblocks.loadWorldList(); + worlds = dragonblocks.backendCall("getWorlds"); content.style.display = "inherit"; status.style.display = "none"; @@ -435,6 +417,8 @@ content.style.width = logo.offsetWidth + "px"; mainmenu.style.visibility = "visible"; + let splashes = $.getJSON("splashes.json").responseJSON; + splash.innerHTML = splashes[Math.floor(Math.random() * splashes.length)]; let fontSize = Math.min(parseInt(10000 / splash.clientWidth), 30); splash.style.fontSize = fontSize + "px"; diff --git a/engine/map.js b/engine/map.js index 4ff558d..0a56229 100644 --- a/engine/map.js +++ b/engine/map.js @@ -23,39 +23,91 @@ dragonblocks.Map = class { - constructor() + constructor(data) { - dblib.copy(this, dragonblocks.world.map); - this.data = this.data || this.content; - delete this.content; + if (data) + this.deserialize(data); + else + this.clear(); + + this.initGraphics(); + this.updateGraphics(); + } + + serialize() + { + return { + data: this.data, + width: this.width, + height: this.height, + displayLeft: this.displayLeft, + displayTop: this.displayTop, + structures: this.structures, + entities: dblib.removeTmp(this.entities), + }; } - load() + deserialize(data) { - for (let x = 0; x < this.width; x++) + this.data = []; + this.width = data.width; + this.height = data.height; + this.displayLeft = data.displayLeft; + this.displayTop = data.displayTop; + this.entities = []; + this.structures = data.structures; + + for (let x = 0; x < this.width; x++) { + this.data[x] = []; for (let y = 0; y < this.height; y++) - this.setNode(x, y, new dragonblocks.MapNode().createFromMapNode(this.data[x][y])); + this.setNode(x, y, new dragonblocks.MapNode().createFromMapNode(data.data[x][y])); + } - this.initGraphics(); + for (let entity of data.entities) + new dragonblocks.SpawnedEntity(entity); + } + + clear() + { + this.data = []; + this.width = dragonblocks.settings.map.width; + this.height = dragonblocks.settings.map.height; + this.displayTop = dragonblocks.settings.map.height / 2; + this.displayLeft = dragonblocks.settings.map.width / 2 - 5; + this.entities = []; + this.structures = {}; + + for (let x = 0; x < this.width; x++) { + this.data[x] = []; + for (let y = 0; y < this.height; y++) + this.setNode(x, y, new dragonblocks.MapNode("air")); + } + } + + withinBounds(x, y) + { + return x < this.width && y < this.height && x >= 0 && y >= 0; + } + + getNode(x, y) + { + if (this.withinBounds(x, y)) + return this.data[x][y]; } setNode(x, y, node) { + node = new dragonblocks.MapNode(node); + if (this.withinBounds(x, y)) { let oldNode = this.data[x][y]; let oldNodeDef = oldNode instanceof dragonblocks.MapNode && oldNode.toNode(); - oldNodeDef && oldNodeDef.onremove && oldNodeDef.onremove(x, y); - - for (let func of dragonblocks.onRemoveNodeCallbacks) - func(x, y); + oldNodeDef && oldNodeDef.onremove && oldNodeDef.onremove(this, x, y); this.data[x][y] = node; let nodeDef = node.toNode(); - nodeDef.onset && nodeDef.onset(x, y); - - for (let func of dragonblocks.onSetNodeCallbacks) - func(x, y); + nodeDef.onset && nodeDef.onset(this, x, y); this.updateNodeGraphics(x, y); } @@ -71,25 +123,14 @@ dragonblocks.Map = class continue; let nodeDef = node.toNode(); - nodeDef.onactivate && nodeDef.onactivate(ix, iy); + nodeDef.onactivate && nodeDef.onactivate(this, ix, iy); - for(let func of dragonblocks.onActivateNodeCallbacks) - func(ix, iy); + for (let func of dragonblocks.onActivateCallbacks) + func(this, ix, iy); } } } - getNode(x, y) - { - if (this.withinBounds(x, y)) - return this.data[x][y]; - } - - withinBounds(x, y) - { - return x < this.width && y < this.height && x >= 0 && y >= 0; - } - getNodeDisplay(x, y) { return document.getElementById("dragonblocks.map.node[" + (x - this.displayLeft) + "][" + (y - this.displayTop) + "]"); @@ -163,14 +204,26 @@ dragonblocks.Map = class } } } -}; -dragonblocks.setNode = (x, y, node) => { - dragonblocks.map.setNode(x, y, new dragonblocks.MapNode(node)); + addStructure(name, msg, pos) + { + this.structures[name] = this.structures[name] || []; + this.structures[name].push({msg, pos}); + } + + spawnEntity(name, x, y) + { + let def = dragonblocks.entities[name]; + + if (def) + return new dragonblocks.SpawnedEntity(def, this, x, y); + } + }; -dragonblocks.getNode = (x, y) => { - return dragonblocks.map.getNode(x, y); +dragonblocks.onActivateCallbacks = []; +dragonblocks.registerOnActivate = func => { + dragonblocks.onActivateCallbacks.push(func); }; dragonblocks.registerOnStarted(_ => { diff --git a/engine/map_interaction.js b/engine/map_interaction.js index 9ad23de..8f3fe0d 100644 --- a/engine/map_interaction.js +++ b/engine/map_interaction.js @@ -38,42 +38,39 @@ dragonblocks.MapInteraction = { crack.addEventListener("mouseleave", event => { self.digStop(); - let [x, y] = dragonblocks.map.getScreenCoordinates(event.srcElement.offsetLeft, event.srcElement.offsetTop); - dragonblocks.map.getNodeDisplay(x, y).style.boxShadow = "none"; + let [x, y] = self.map.getScreenCoordinates(event.srcElement.offsetLeft, event.srcElement.offsetTop); + self.map.getNodeDisplay(x, y).style.boxShadow = "none"; }); crack.addEventListener("mouseover", event => { - let [x, y] = dragonblocks.map.getScreenCoordinates(event.srcElement.offsetLeft + document.getElementById("dragonblocks.map").offsetLeft, event.srcElement.offsetTop + document.getElementById("dragonblocks.map").offsetTop); - dragonblocks.map.getNodeDisplay(x, y).style.boxShadow = "0 0 0 1px black inset"; + let [x, y] = self.map.getScreenCoordinates(event.srcElement.offsetLeft + document.getElementById("dragonblocks.map").offsetLeft, event.srcElement.offsetTop + document.getElementById("dragonblocks.map").offsetTop); + self.map.getNodeDisplay(x, y).style.boxShadow = "0 0 0 1px black inset"; }); }, - dig(x, y) + dig(map, x, y) { - let node = dragonblocks.getNode(x, y); + console.log(this); + let node = map.getNode(x, y); if (! node) return false; let nodeDef = node.toNode(); - if (nodeDef.ondig && nodeDef.ondig(x, y) == false) + if (nodeDef.ondig && nodeDef.ondig(map, x, y) == false) return false; - for (let func of dragonblocks.onDigNodeCallbacks) - if (func(x, y) == false) - return false; - nodeDef.playSound("dug"); - dragonblocks.setNode(x, y, "air"); - dragonblocks.map.activate(x, y); + map.setNode(x, y, "air"); + map.activate(map, x, y); return true; }, digStart(x, y) { - let node = dragonblocks.getNode(x, y); + let node = this.map.getNode(x, y); let nodeDef = node.toNode(); node.meta.hardness = nodeDef.hardness; @@ -84,17 +81,14 @@ dragonblocks.MapInteraction = { let crack = document.getElementById("dragonblocks.crack[" + this.id + "]") crack.style.visibility = "visible"; - crack.style.left = (x - dragonblocks.map.displayLeft) * dragonblocks.settings.map.scale + "px"; - crack.style.top = (y - dragonblocks.map.displayTop) * dragonblocks.settings.map.scale + "px"; + crack.style.left = (x - this.map.displayLeft) * dragonblocks.settings.map.scale + "px"; + crack.style.top = (y - this.map.displayTop) * dragonblocks.settings.map.scale + "px"; dragonblocks.log("Punched Node at (" + x + ", " + y + ")"); - nodeDef.onpunch && nodeDef.onpunch(x,y); - - for (let func of dragonblocks.onPunchNodeCallbacks) - func(x, y); + nodeDef.onpunch && nodeDef.onpunch(this.map, x,y); - dragonblocks.map.activate(x, y); + this.map.activate(x, y); this.digTick(x, y); }, @@ -103,7 +97,7 @@ dragonblocks.MapInteraction = { { let self = this; - let node = dragonblocks.getNode(x, y); + let node = this.map.getNode(x, y); if (! node) return; @@ -134,15 +128,15 @@ dragonblocks.MapInteraction = { digEnd(x, y) { - let node = dragonblocks.getNode(x, y); + let node = this.map.getNode(x, y); if (! node) return; let nodeDef = node.toNode(); - if (this.dig(x, y)) - dragonblocks.handleNodeDrop(this.tmp.mainInventory, nodeDef, x, y); + if (this.dig(this.map, x, y)) + dragonblocks.handleNodeDrop(this.tmp.mainInventory, nodeDef, this.map, x, y); document.getElementById("dragonblocks.crack[" + this.id + "]").style.visibility = "hidden"; }, @@ -153,22 +147,18 @@ dragonblocks.MapInteraction = { document.getElementById("dragonblocks.crack[" + this.id + "]").style.visibility = "hidden"; }, - place(x, y, node) + place(map, x, y, node) { - let oldNode = dragonblocks.getNode(x, y); + let oldNode = this.map.getNode(x, y); if (! oldNode || oldNode.stable) return false; - if (node.onplace && node.onplace(x, y) == false) + if (node.onplace && node.onplace(map, x, y) == false) return false; - for (let func of dragonblocks.onPlaceNodeCallbacks) - if (func(node, x, y) == false) - return false; - - dragonblocks.setNode(x, y, node); - dragonblocks.map.activate(x, y); + map.setNode(x, y, node); + map.activate(x, y); node.playSound("place"); @@ -178,13 +168,10 @@ dragonblocks.MapInteraction = { build(x, y) { if(this.canReach(x, y)) { - let oldNodeDef = dragonblocks.getNode(x, y).toNode(); - oldNodeDef.onclick && oldNodeDef.onclick(x, y); + let oldNodeDef = this.map.getNode(x, y).toNode(); + oldNodeDef.onclick && oldNodeDef.onclick(this.map, x, y); - for (let func of dragonblocks.onClickNodeCallbacks) - func(x, y); - - if (this.touch(x, y)) + if (this.touch(this.map, x, y)) return; let wielded = this.getWieldedItem(); @@ -196,18 +183,13 @@ dragonblocks.MapInteraction = { let itemDef = itemstack.toItem(); if (itemDef instanceof dragonblocks.Node) { - if (! this.place(x, y, itemDef) || this.meta.creative) + if (! this.place(this.map, x, y, itemDef) || this.meta.creative) wielded.add(itemstack); } else { - if (! itemDef.onuse || ! itemDef.onuse(x, y)) { + if (! itemDef.onuse || ! itemDef.onuse(this.map, x, y)) + wielded.add(itemstack); + else if (this.meta.creative) wielded.add(itemstack); - } else { - for (let func of dragonblocks.onUseItemCallbacks) - func(itemDef, x, y); - - if (this.meta.creative) - wielded.add(itemstack); - } } } }, @@ -218,6 +200,6 @@ dragonblocks.MapInteraction = { } }; -dragonblocks.handleNodeDrop = (inventory, nodeDef, x, y) => { - dragonblocks.dropItem(inventory.add((nodeDef.drops instanceof Function) ? nodeDef.drops() : nodeDef.drops), x + 0.2, y + 0.2); +dragonblocks.handleNodeDrop = (inventory, nodeDef, map, x, y) => { + dragonblocks.dropItem(inventory.add((nodeDef.drops instanceof Function) ? nodeDef.drops() : nodeDef.drops), map, x + 0.2, y + 0.2); }; diff --git a/engine/mapgen.js b/engine/mapgen.js index b1c6e13..21a9cd2 100644 --- a/engine/mapgen.js +++ b/engine/mapgen.js @@ -23,12 +23,6 @@ dragonblocks.mapgen = {}; -dragonblocks.mapgen.addStructure = (name, msg, pos) => { - let strs = dragonblocks.world.structures; - strs[name] = strs[name] || []; - strs[name].push({msg: msg, pos: pos}); -}; - dragonblocks.mapgen.biomes = []; dragonblocks.registerBiome = obj => { dragonblocks.mapgen.biomes.push(obj); @@ -44,27 +38,19 @@ dragonblocks.registerOre = obj => { dragonblocks.mapgen.ores.push(obj); }; -dragonblocks.mapgen.selected = "empty"; dragonblocks.mapgen.list = {}; -dragonblocks.generateMap = _ => { - dragonblocks.mapgen.list[dragonblocks.mapgen.selected](); +dragonblocks.mapgen.generate = (mapgenName, map) => { + dragonblocks.mapgen.list[mapgenName](map); }; -dragonblocks.mapgen.list["v3"] = _ => { +dragonblocks.mapgen.list["v3"] = map => { // Localize variables - let int = parseInt; - - let snode = dragonblocks.setNode; - let gnode = dragonblocks.getNode; - let schem = dragonblocks.Schematic; - let rand = dblib.random; - - let height = dragonblocks.map.height; - let width = dragonblocks.map.width; + let height = map.height; + let width = map.width; // Biomes @@ -89,7 +75,7 @@ dragonblocks.mapgen.list["v3"] = _ => { let border = Math.min(d + rand(biomeList[i].size[0], biomeList[i].size[1]), width); - dragonblocks.mapgen.addStructure(biomeList[i].name, "(" + d + " - " + border + ", *)", {x: int((d + border)/2), y: 5}); + map.addStructure(biomeList[i].name, "(" + d + " - " + border + ", *)", {x: int((d + border)/2), y: 5}); for(; d < border; d++) biomes.push(i); @@ -196,7 +182,7 @@ dragonblocks.mapgen.list["v3"] = _ => { let gx = int((start + end) / 2); let gy = ground[gx] - 3; - dragonblocks.mapgen.addStructure(level.name, "(" + start + " - " + end + ", *)", {x: gx, y: gy}); + map.addStructure(level.name, "(" + start + " - " + end + ", *)", {x: gx, y: gy}); structAdded = true; } @@ -236,7 +222,7 @@ dragonblocks.mapgen.list["v3"] = _ => { if (! ground[x] || y < ground[x] || (y / height * 100 - 50) < ore.deep) return false; - snode(x, y, ore.name); + map.setNode(x, y, ore.name); return true; }; @@ -249,18 +235,18 @@ dragonblocks.mapgen.list["v3"] = _ => { let biome = biomeList[biomes[x]]; for (; y < g + 1; y++) - snode(x, y, biome.surface); + map.setNode(x, y, biome.surface); for (; y < g + 5; y++) - snode(x, y, biome.ground); + map.setNode(x, y, biome.ground); for (; y < height; y++) { - snode(x, y, biome.underground); + map.setNode(x, y, biome.underground); for (let ore of dragonblocks.mapgen.ores) { if (dblib.random(0, ore.factor) == 0) { if (setOre(x, y, ore)) - dragonblocks.mapgen.addStructure(ore.name, "(" + x + ", " + y + ")", {x: x, y: y}); + map.addStructure(ore.name, "(" + x + ", " + y + ")", {x, y}); for (let i = 0; i < ore.clustersize; i++) setOre(x + dblib.random(-2, 2), y + dblib.random(-2, 2), ore); @@ -285,25 +271,25 @@ dragonblocks.mapgen.list["v3"] = _ => { start = start || x; water[x] = true; - snode(x, top, biome.watertop); + map.setNode(x, top, biome.watertop); let y = top + 1; for(; y < ground[x]; y++) - snode(x, y, biome.water); + map.setNode(x, y, biome.water); for(; y < ground[x] + 5; y++) - snode(x, y, biome.floor); + map.setNode(x, y, biome.floor); } else if (start) { let end = x - 1; - dragonblocks.mapgen.addStructure("water", "(" + start + " - " + end + ", " + top + ")", {x: int((start + end) / 2), y: top}); + map.addStructure("water", "(" + start + " - " + end + ", " + top + ")", {x: int((start + end) / 2), y: top}); start = 0; } } if (start) { let end = width; - dragonblocks.mapgen.addStructure("water", "(" + start + " - " + end + ", " + top + ")", {x: int((start + end) / 2), y: top}); + map.addStructure("water", "(" + start + " - " + end + ", " + top + ")", {x: int((start + end) / 2), y: top}); } } @@ -319,8 +305,8 @@ dragonblocks.mapgen.list["v3"] = _ => { for (let tree of biome.trees) { if (Math.random() <= tree.chance) { - snode(x, g - 1, tree.sapling); - gnode(x, g - 1) && dragonblocks.finishTimer("growTimer", gnode(x, g - 1).meta); + map.setNode(x, g - 1, tree.sapling); + map.getNode(x, g - 1) && dragonblocks.finishTimer("growTimer", map.getNode(x, g - 1).meta); nextTree = x + tree.width; break; } @@ -332,14 +318,14 @@ dragonblocks.mapgen.list["v3"] = _ => { // Ressource Blobs (e.g. Gravel, Dirt) { - let belowGround = (node, x, y) => { - return y > ground[x] + let belowGround = (node, map, x, y) => { + return y > ground[x]; }; - function structure(x, y, mat) { + let structure = (x, y, mat) => { new schem([["§" + mat, mat], [mat, mat]]) .addFunction(belowGround) - .apply(x, y); + .apply(map, x, y); let sides = [ new schem([[mat, mat], ["§", ""]]), @@ -373,20 +359,20 @@ dragonblocks.mapgen.list["v3"] = _ => { for (let i in sides) { if (Math.random() * 1.2 < 1){ - sides[i].apply(x, y); + sides[i].apply(map, x, y); for (let j = i; j <= int(i) + 1; j++){ let corner = corners[j] || corners[0]; if (Math.random() * 1.5 < 1) - corner.apply(x, y); + corner.apply(map, x, y); } if (Math.random() * 2 < 1) - moresides[i].apply(x, y); + moresides[i].apply(map, x, y); } } - } + }; for (let material of dragonblocks.mapgen.materials) for (let i = 0; i < width / material.factor; i++) @@ -396,7 +382,7 @@ dragonblocks.mapgen.list["v3"] = _ => { // Caves { - let cave = (x, y, r) => { + let cave = (map, x, y, r) => { r *= 2; let caveschem = new schem([ @@ -407,52 +393,51 @@ dragonblocks.mapgen.list["v3"] = _ => { ["", "air", "air", "air", ""], ]); - caveschem.addFunction((node, x, y) => { + caveschem.addFunction((node, map, x, y) => { if (y < ground[x]) return false; if (dblib.random(0, r) == 0) - cave(x, y, r); + cave(map, x, y, r); }); - caveschem.apply(x, y); + caveschem.apply(map, x, y); }; - let newCave = (x, y) => { + let newCave = (map, x, y) => { let r = dblib.random(0, 10) + 1; if (y < ground[x] + 10) return false; - cave(x, y, r); + cave(map, x, y, r); - dragonblocks.mapgen.addStructure("cave", "(" + x + ", " + y + ")", {x: x, y: y}); + map.addStructure("cave", "(" + x + ", " + y + ")", {x, y}); }; let r = dblib.random(width / 5, width / 15); for (let i = 0; i < r; i++) - newCave(rand(0, width), rand(0, height)); + newCave(map, rand(0, width), rand(0, height)); } }; -dragonblocks.mapgen.list["flat"] = _ => { - for (let x = 0; x < dragonblocks.map.width; x++) { +dragonblocks.mapgen.list["flat"] = map => { + for (let x = 0; x < map.width; x++) { let y = 0; - for(; y < dragonblocks.map.height - 5; y++) - dragonblocks.setNode(x, y, "air"); + for(; y < map.height - 5; y++) + map.setNode(x, y, "air"); - for(; y < dragonblocks.map.height - 4; y++) - dragonblocks.setNode(x, y, "dirt:grass"); + for(; y < map.height - 4; y++) + map.setNode(x, y, "dirt:grass"); - for(; y < dragonblocks.map.height - 3; y++) - dragonblocks.setNode(x, y, "dirt:dirt"); + for(; y < map.height - 3; y++) + map.setNode(x, y, "dirt:dirt"); - for(; y < dragonblocks.map.height; y++) - dragonblocks.setNode(x, y, "core:stone"); + for(; y < map.height; y++) + map.setNode(x, y, "core:stone"); } }; -dragonblocks.mapgen.list["empty"] = _ => {}; - +dragonblocks.mapgen.list["void"] = _ => {}; diff --git a/engine/node.js b/engine/node.js index 8096526..f0625f0 100644 --- a/engine/node.js +++ b/engine/node.js @@ -51,33 +51,33 @@ dragonblocks.Node = class extends dragonblocks.Item let oldOnset = this.onset; let self = this; - this.onset = (x, y) => { - let meta = dragonblocks.getNode(x, y).meta; + this.onset = (map, x, y) => { + let meta = map.getNode(x, y).meta; meta.liquidInterval = setInterval(_ => { for(let [ix, iy] of [[x + 1, y], [x - 1, y], [x, y + 1]]){ - let node = dragonblocks.getNode(ix, iy); + let node = map.getNode(ix, iy); if (! node || node.stable || node.toNode().liquid) continue; - dragonblocks.setNode(ix, iy, self.name); + map.setNode(ix, iy, self.name); } }, self.liquidTickSpeed || 2000); if (oldOnset) - oldOnset(x, y); + oldOnset(map, x, y); return meta; }; let oldOnremove = this.onremove; - this.onremove = (x, y) => { - clearInterval(dragonblocks.getNode(x, y).meta.liquidInterval); + this.onremove = (map, x, y) => { + clearInterval(map.getNode(x, y).meta.liquidInterval); if (oldOnremove) - oldOnremove(x, y); + oldOnremove(map, x, y); }; } } @@ -90,38 +90,3 @@ dragonblocks.registerNode = def => { dragonblocks.nodes[nodeDef.name] = nodeDef; dragonblocks.registeredNodes.push(nodeDef); }; - -dragonblocks.onSetNodeCallbacks = []; -dragonblocks.registerOnSetNode = func => { - dragonblocks.onSetNodeCallbacks.push(func); -}; - -dragonblocks.onRemoveNodeCallbacks = []; -dragonblocks.registerOnRemoveNode = func => { - dragonblocks.onRemoveNodeCallbacks.push(func); -}; - -dragonblocks.onPlaceNodeCallbacks = []; -dragonblocks.registerOnPlaceNode = func => { - dragonblocks.onPlaceNodeCallbacks.push(func); -}; - -dragonblocks.onDigNodeCallbacks = []; -dragonblocks.registerOnDigNode = func => { - dragonblocks.onDigNodeCallbacks.push(func); -}; - -dragonblocks.onClickNodeCallbacks = []; -dragonblocks.registerOnClickNode = func => { - dragonblocks.onClickNodeCallbacks.push(func); -}; - -dragonblocks.onActivateNodeCallbacks = []; -dragonblocks.registerOnActivateNode = func => { - dragonblocks.onActivateNodeCallbacks.push(func); -}; - -dragonblocks.onPunchNodeCallbacks = []; -dragonblocks.registerOnPunchNode = func => { - dragonblocks.onPunchNodeCallbacks.push(func); -}; diff --git a/engine/player.js b/engine/player.js index 7787140..4a8d1d1 100644 --- a/engine/player.js +++ b/engine/player.js @@ -57,20 +57,14 @@ dragonblocks.registerEntity({ } }); -dragonblocks.Player = class extends dragonblocks.SpawnedEntity{ - constructor() +dragonblocks.Player = class extends dragonblocks.SpawnedEntity +{ + constructor(data, map) { - if (dragonblocks.worldIsLoaded) { - super(dragonblocks.world.spawnedEntities.filter(entity => { - return entity.name == "dragonblocks:player"; - })[0]); - - dragonblocks.world.spawnedEntities = dragonblocks.world.spawnedEntities.filter(entity => { - return entity.name != "dragonblocks:player"; - }); - } else { - super(dragonblocks.entities["dragonblocks:player"], dragonblocks.map.width / 2, 5); - } + if (data) + super(data, map); + else + super(dragonblocks.entities["dragonblocks:player"], map, map.width / 2, 5); let self = this; @@ -78,10 +72,10 @@ dragonblocks.Player = class extends dragonblocks.SpawnedEntity{ this.skin = this.meta.skin; // Inventory - this.tmp.inventory = new dragonblocks.InventoryGroup(); // Create Inventory Group that can hold multible Inventories + this.tmp.inventory = new dragonblocks.InventoryGroup(); // Create inventory group that can hold multiple inventories // Main Inventory - this.tmp.mainInventory = new dragonblocks.Inventory(32, 8); // The Main Inventory + this.tmp.mainInventory = new dragonblocks.Inventory(32, 8); // The main Inventory if (this.meta.mainInventory) this.tmp.mainInventory.deserialize(this.meta.mainInventory); // Load saved Inventory @@ -89,7 +83,7 @@ dragonblocks.Player = class extends dragonblocks.SpawnedEntity{ this.tmp.mainInventory.addEventListener("updateStack", event => { self.meta.mainInventory = this.tmp.mainInventory.serialize(); // Save inventory after every change - if (self.gamemode == "creative" && event.stack.count > 1) // Keep itemcount of every stack at one when in creative + if (self.gamemode == "creative" && event.stack.count > 1) // Keep count of every stack at one when in creative event.stack.count = 1; }); @@ -138,16 +132,17 @@ dragonblocks.Player = class extends dragonblocks.SpawnedEntity{ // Map Scroll setInterval(_ => { - if (dragonblocks.map.displayLeft + dragonblocks.map.displayWidth < self.x + self.width + 3) - dragonblocks.map.displayLeft = parseInt(self.x + self.width + 3 - dragonblocks.map.displayWidth); - else if (dragonblocks.map.displayLeft > self.x - 2) - dragonblocks.map.displayLeft = parseInt(self.x - 2); - if (dragonblocks.map.displayTop + dragonblocks.map.displayHeight < self.y + self.height + 3) - dragonblocks.map.displayTop = parseInt(self.y + self.height + 3 - dragonblocks.map.displayHeight); - else if (dragonblocks.map.displayTop > self.y - 2) - dragonblocks.map.displayTop = parseInt(self.y - 2); - - dragonblocks.map.updateGraphics(); + if (map.displayLeft + map.displayWidth < self.x + self.width + 3) + map.displayLeft = parseInt(self.x + self.width + 3 - map.displayWidth); + else if (map.displayLeft > self.x - 2) + map.displayLeft = parseInt(self.x - 2); + + if (map.displayTop + map.displayHeight < self.y + self.height + 3) + map.displayTop = parseInt(self.y + self.height + 3 - map.displayHeight); + else if (map.displayTop > self.y - 2) + map.displayTop = parseInt(self.y - 2); + + map.updateGraphics(); }); // Controls @@ -225,8 +220,6 @@ dragonblocks.Player = class extends dragonblocks.SpawnedEntity{ }); } - let mapDisplay = document.getElementById("dragonblocks.map"); - addEventListener("mouseup", event => { if (event.which == 1) self.digStop(); @@ -238,12 +231,12 @@ dragonblocks.Player = class extends dragonblocks.SpawnedEntity{ }); // Map Interaction Controls - for (let x = 0; x < dragonblocks.map.displayWidth; x++) { - for (let y = 0; y < dragonblocks.map.displayHeight; y++) { + for (let x = 0; x < map.displayWidth; x++) { + for (let y = 0; y < map.displayHeight; y++) { let nodeDisplay = document.getElementById("dragonblocks.map.node[" + x + "][" + y + "]"); nodeDisplay.addEventListener("mouseover", event => { - if (self.canReach(x + dragonblocks.map.displayLeft, y + dragonblocks.map.displayTop)) + if (self.canReach(x + map.displayLeft, y + map.displayTop)) event.srcElement.style.boxShadow = "0 0 0 1px black inset"; }); @@ -252,7 +245,7 @@ dragonblocks.Player = class extends dragonblocks.SpawnedEntity{ }); nodeDisplay.addEventListener("mousedown", event => { - let [ix, iy] = [x + dragonblocks.map.displayLeft, y + dragonblocks.map.displayTop]; + let [ix, iy] = [x + map.displayLeft, y + map.displayTop]; switch(event.which) { case 1: @@ -268,6 +261,11 @@ dragonblocks.Player = class extends dragonblocks.SpawnedEntity{ } } + serialize() + { + return dblib.removeTmp([this])[0]; + } + set skin(value) { this.meta.skin = value; @@ -391,4 +389,4 @@ dragonblocks.Player = class extends dragonblocks.SpawnedEntity{ } }; -Object.assign(dragonblocks.Player.prototype, dragonblocks.MapInteraction); //Mixin +Object.assign(dragonblocks.Player.prototype, dragonblocks.MapInteraction); // Mixin diff --git a/engine/schematic.js b/engine/schematic.js index ba893f9..af1f6cd 100644 --- a/engine/schematic.js +++ b/engine/schematic.js @@ -59,14 +59,14 @@ dragonblocks.Schematic = class } } - apply(x, y) + apply(map, x, y) { for (let pixel of this.data) { let mx, my; mx = pixel.x + x; my = pixel.y + y; - let node = dragonblocks.getNode(mx, my); + let node = map.getNode(mx, my); if (! node) continue; @@ -75,14 +75,14 @@ dragonblocks.Schematic = class let doApply = true; for (let func of this.functions) { - if (func(nodeDef, mx, my, pixel.node) == false) { + if (func(nodeDef, map, mx, my, pixel.node) == false) { doApply = false; break; } } if (doApply) - dragonblocks.setNode(mx, my, pixel.node); + map.setNode(mx, my, pixel.node); } return this; diff --git a/engine/spawned_entity.js b/engine/spawned_entity.js index 0a4e277..94202d0 100644 --- a/engine/spawned_entity.js +++ b/engine/spawned_entity.js @@ -23,8 +23,10 @@ dragonblocks.SpawnedEntity = class { - constructor(def, x, y){ + constructor(def, map, x, y) + { dblib.copy(this, def); + this.tmp = {map}; if (def instanceof dragonblocks.Entity) { this.id = dragonblocks.getToken(); @@ -40,17 +42,16 @@ dragonblocks.SpawnedEntity = class } this.restorePhysics(); - this.tmp = {}; - this.addGraphics(); let self = this; this.tickInterval = setInterval(_ => { - self.tick() + self.tick(); }, 100); + this.physicInterval = setInterval(_=>{ - self.physicsTick() + self.physicsTick(); }); let entityDef = this.toEntity(); @@ -64,7 +65,7 @@ dragonblocks.SpawnedEntity = class self.restorePhysics(); }); - dragonblocks.spawnedEntities.push(this); + map.entities.push(this); } toEntity() @@ -78,14 +79,15 @@ dragonblocks.SpawnedEntity = class entityDef.ondespawn && entityDef.ondespawn(this); let id = this.id; - dragonblocks.spawnedEntities = dragonblocks.spawnedEntities.filter(entity => { + this.map.entities = this.map.entities.filter(entity => { return entity.id != id; }); clearInterval(this.physicInterval); clearInterval(this.tickInterval); - document.getElementById("dragonblocks.entity[" + this.id + "]").remove(); + let display = document.getElementById("dragonblocks.entity[" + this.id + "]"); + display && display.remove(); } restorePhysics() @@ -101,7 +103,7 @@ dragonblocks.SpawnedEntity = class if (this.x < 0) return false; - if (this.x + this.width > dragonblocks.map.width) + if (this.x + this.width > this.map.width) return false; return this.collision(); @@ -112,7 +114,7 @@ dragonblocks.SpawnedEntity = class if (this.y < 0) return false; - if (this.y + this.height > dragonblocks.map.height) + if (this.y + this.height > this.map.height) return false; return this.collision(); @@ -122,7 +124,7 @@ dragonblocks.SpawnedEntity = class { for (let ix = Math.floor(this.x); ix <= Math.ceil(this.x + this.width - 0.01) - 1; ix++) for (let iy = Math.floor(this.y); iy <= Math.ceil(this.y + this.height - 0.01) - 1; iy++) - if (dragonblocks.getNode(ix, iy).mobstable) + if (this.map.getNode(ix, iy).mobstable) return false; return true; } @@ -147,8 +149,8 @@ dragonblocks.SpawnedEntity = class { let t = new Date().getTime() / 1000; - var oldX = this.x; - var dtx = t - this.tx0; + let oldX = this.x; + let dtx = t - this.tx0; if (this.ax) this.x = this.ax * dtx * dtx + this.vx * dtx + this.x0; @@ -161,8 +163,8 @@ dragonblocks.SpawnedEntity = class this.toEntity().oncollide && this.toEntity().oncollide(this); } - var oldY = this.y; - var dty = t - this.ty0; + let oldY = this.y; + let dty = t - this.ty0; if (this.ay) this.y = this.ay * dty * dty + this.vy * dty + this.y0; @@ -180,8 +182,10 @@ dragonblocks.SpawnedEntity = class this.updateGraphics(); } - touch(x, y) + touch(map, x, y) { + if (map != this.map) + return false; for (let ix = Math.floor(this.x); ix <= Math.ceil(this.x + this.width - 0.01) - 1; ix++) for (let iy = Math.floor(this.y); iy <= Math.ceil(this.y + this.height - 0.01) - 1; iy++) if (iy == y && ix == x) @@ -190,14 +194,13 @@ dragonblocks.SpawnedEntity = class addGraphics(obj) { - var display = document.getElementById("dragonblocks.map").appendChild(document.createElement("div")); + let display = document.getElementById("dragonblocks.map").appendChild(document.createElement("div")); display.id = "dragonblocks.entity[" + this.id + "]"; display.style.position = "absolute"; display.style.width = this.width * dragonblocks.settings.map.scale + "px"; display.style.height = this.height * dragonblocks.settings.map.scale + "px"; display.style.zIndex = "0"; - display.addEventListener("mouseover", event => { event.srcElement.style.boxShadow = "0 0 0 1px black inset"; }); @@ -233,8 +236,8 @@ dragonblocks.SpawnedEntity = class if (! display) return; - display.style.left = (this.x - dragonblocks.map.displayLeft) * dragonblocks.settings.map.scale + "px"; - display.style.top = (this.y - dragonblocks.map.displayTop) * dragonblocks.settings.map.scale + "px"; + display.style.left = (this.x - this.map.displayLeft) * dragonblocks.settings.map.scale + "px"; + display.style.top = (this.y - this.map.displayTop) * dragonblocks.settings.map.scale + "px"; } updateTexture() @@ -325,7 +328,7 @@ dragonblocks.SpawnedEntity = class let y = Math.ceil(entityY); if (y - entityY <= 0.01) { - let node = dragonblocks.getNode(x, y); + let node = this.map.getNode(x, y); if (! node || node.mobstable) return true; @@ -384,11 +387,9 @@ dragonblocks.SpawnedEntity = class if (this.gravity) this.gravity = true; } -}; -dragonblocks.spawnedEntities = []; -dragonblocks.registerOnStarted(_ => { - if (dragonblocks.worldIsLoaded) - for (let entity of dragonblocks.world.spawnedEntities) - new dragonblocks.SpawnedEntity(entity); -}); + get map() + { + return this.tmp.map; + } +}; diff --git a/engine/world.js b/engine/world.js index 61ccab1..11996e5 100644 --- a/engine/world.js +++ b/engine/world.js @@ -1,7 +1,7 @@ /* * world.js * - * Copyright 2020 Elias Fleckenstein + * Copyright 2021 Elias Fleckenstein * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,36 +21,81 @@ * */ -dragonblocks.getSavestring = _ => { - dragonblocks.world.map = dragonblocks.map; - dragonblocks.world.mods = dragonblocks.mods; - dragonblocks.world.spawnedEntities = dblib.removeTmp(dragonblocks.spawnedEntities); +dragonblocks.World = class +{ + constructor(properties) + { + this.name = properties.name; + this.isLoaded = properties.isLoaded; - return JSON.stringify(dragonblocks.world); -} + if (this.isLoaded) { + this.load(); + } else { + this.mods = properties.mods; -dragonblocks.save = _ => { - if (dragonblocks.loggedin) - return dragonblocks.backendCall("saveWorld", true, {name: dragonblocks.worldname, world: dragonblocks.getSavestring()}); -}; + this.loadMods(); -dragonblocks.checkWorldnameSpelling = name => { - return name.match(/^[a-zA-Z0-9]+$/); -}; + this.map = new dragonblocks.Map(); + this.player = new dragonblocks.Player(null, this.map); + + this.player.setGamemode(properties.gamemode); + dragonblocks.mapgen.generate(properties.mapgen, this.map); + } + } + + serialize() + { + return { + mods: this.mods, + map: this.map.serialize(), + player: this.player.serialize(), + }; + } + + deserialize(data) + { + this.mods = data.mods; + + this.loadMods(); + + this.map = new dragonblocks.Map(data.map); + this.player = new dragonblocks.Player(data.player, this.map); + } -dragonblocks.loadWorldList = _ => { - dragonblocks.worlds = dragonblocks.backendCall("getWorlds"); + save() + { + if (dragonblocks.loggedin) + return dragonblocks.backendCall("saveWorld", true, {name: this.name, world: JSON.stringify(this.serialize())}); + } + + load() + { + this.deserialize($.getJSON("worlds/" + this.name + "/world.json").responseJSON); + } + + loadMods() + { + dragonblocks.loadMods(this.mods); + } }; -dragonblocks.getEmptyWorld = function(){ - return { - map:{ - data: Array(dragonblocks.settings.map.width).fill(Array(dragonblocks.settings.map.width).fill(new dragonblocks.MapNode("air"))), - width: dragonblocks.settings.map.width, - height: dragonblocks.settings.map.height, - displayTop: dragonblocks.settings.map.height / 2, - displayLeft: dragonblocks.settings.map.width / 2 - 5, - }, - structures: {}, - }; -} +dragonblocks.World.Properties = class +{ + constructor(isLoaded) + { + this.name = ""; + this.isLoaded = isLoaded; + + if (! isLoaded) { + this.mods = []; + + this.gamemode = dragonblocks.settings.defaultWorldOptions.gamemode; + this.mapgen = dragonblocks.settings.defaultWorldOptions.mapgen; + } + } + + checkSpelling() + { + return this.name.match(/^[a-zA-Z0-9]+$/); + } +}; diff --git a/game/chest/init.js b/game/chest/init.js index a827158..74dd448 100644 --- a/game/chest/init.js +++ b/game/chest/init.js @@ -5,14 +5,14 @@ dragonblocks.registerNode({ hardness: 6, desc: "Chest", stable: true, - onset: (x, y) => { - let meta = dragonblocks.getNode(x, y).meta; + onset: (map, x, y) => { + let meta = map.getNode(x, y).meta; meta.inventory = new dragonblocks.Inventory(32, 8); if(meta.inventoryString) meta.inventory.deserialize(meta.inventoryString); }, - onclick: (x, y) => { - let meta = dragonblocks.getNode(x, y).meta; + onclick: (map, x, y) => { + let meta = map.getNode(x, y).meta; dragonblocks.player.setInventoryElements([meta.inventory, dragonblocks.player.tmp.mainInventory]); dragonblocks.player.openInventory(); dragonblocks.nodes["chest:chest"].playSound("open"); @@ -22,8 +22,8 @@ dragonblocks.registerNode({ meta.inventoryString = meta.inventory.serialize(); }; }, - ondig: (x, y) => { - return dragonblocks.getNode(x, y).meta.inventory.isEmpty(); + ondig: (map, x, y) => { + return map.getNode(x, y).meta.inventory.isEmpty(); }, sounds: { open: "chest_open.ogg", diff --git a/game/commands/init.js b/game/commands/init.js index 22f2137..17ce6ec 100644 --- a/game/commands/init.js +++ b/game/commands/init.js @@ -22,7 +22,7 @@ dragonblocks.registerChatcommand({ default: commands.help(arg); break; - } + } } }); dragonblocks.registerChatcommand({ @@ -39,7 +39,7 @@ dragonblocks.registerChatcommand({ func: arg => { let x = parseInt(arg.split(" ")[0]); let y = parseInt(arg.split(" ")[1]); - if(dragonblocks.map.contains(x, y)){ + if(dragonblocks.player.map.withinBounds(x, y)){ dragonblocks.player.teleport(x, y, true); dragonblocks.chatMessage("Teleported to " + x + ", " + y); } @@ -55,10 +55,10 @@ dragonblocks.registerChatcommand({ let x = parseInt(arg.split(" ")[0]); let y = parseInt(arg.split(" ")[1]); let node = arg.split(" ")[2]; - if(dragonblocks.map.contains(x, y)){ + if(dragonblocks.player.map.withinBounds(x, y)){ if(dragonblocks.nodes[node]){ - dragonblocks.setNode(x, y, node); - dragonblocks.chatMessage("Set " + node + " to " + x + ", " + y); + dragonblocks.player.map.setNode(x, y, node); + dragonblocks.chatMessage("Set " + node + " to " + x + ", " + y); } else dragonblocks.chatMessage("Unknown Node."); diff --git a/game/core/init.js b/game/core/init.js index 8bd8843..9bc5da4 100644 --- a/game/core/init.js +++ b/game/core/init.js @@ -63,16 +63,16 @@ dragonblocks.registerNode({ texture: "core_lava.png", groups: ["liquid"], desc: "Lava", - onset: (x, y) => { - dragonblocks.getNode(x, y).meta.lavaInterval = setInterval(_ => { + onset: (map, x, y) => { + map.getNode(x, y).meta.lavaInterval = setInterval(_ => { for(let ix = x - 1; ix <= x + 1; ix++) for(let iy = y - 1; iy <= y + 1; iy++) - if(dragonblocks.getNode(ix, iy) && dragonblocks.getNode(ix, iy).toNode().lavacooling) - dragonblocks.setNode(x, y, "core:obsidian"); + if(map.getNode(ix, iy) && map.getNode(ix, iy).toNode().lavacooling) + map.setNode(x, y, "core:obsidian"); }, 2000); }, - onremove: (x, y) => { - clearInterval(dragonblocks.getNode(x, y).meta.lavaInterval); + onremove: (map, x, y) => { + clearInterval(map.getNode(x, y).meta.lavaInterval); }, liquid: true, }); diff --git a/game/dirt/api.js b/game/dirt/api.js index 0d21f0c..0551059 100644 --- a/game/dirt/api.js +++ b/game/dirt/api.js @@ -15,18 +15,18 @@ dirt.registerDirt = function(obj){ hardness: 3, desc: desc, drops: "dirt:dirt", - onset: (x, y) => { - dragonblocks.getNode(x, y).meta.dirtInterval = setInterval(_ => { + onset: (map, x, y) => { + map.getNode(x, y).meta.dirtInterval = setInterval(_ => { for(let ix = x - 1; ix <= x + 1; ix++) for(let iy = y - 1; iy <= y + 1; iy++) - if(dblib.random(0, 60) == 0 && dragonblocks.getNode(ix, iy) && dragonblocks.getNode(ix, iy).name == "dirt:dirt" && dragonblocks.getNode(ix, iy - 1) && ! dragonblocks.getNode(ix, iy - 1).stable) - dragonblocks.setNode(ix, iy, name); - if(dblib.random(0, 45) == 0 && dragonblocks.getNode(x, y - 1) && dragonblocks.getNode(x, y - 1).stable) - dragonblocks.setNode(x, y, "dirt:dirt"); + if(dblib.random(0, 60) == 0 && map.getNode(ix, iy) && map.getNode(ix, iy).name == "dirt:dirt" && map.getNode(ix, iy - 1) && ! map.getNode(ix, iy - 1).stable) + map.setNode(ix, iy, name); + if(dblib.random(0, 45) == 0 && map.getNode(x, y - 1) && map.getNode(x, y - 1).stable) + map.setNode(x, y, "dirt:dirt"); }, 1000); }, - onremove: (x, y) => { - clearInterval(dragonblocks.getNode(x, y).meta.dirtInterval); + onremove: (map, x, y) => { + clearInterval(map.getNode(x, y).meta.dirtInterval); } }); } diff --git a/game/doors/init.js b/game/doors/init.js index 29de13a..27a8949 100644 --- a/game/doors/init.js +++ b/game/doors/init.js @@ -13,11 +13,11 @@ doors.registerDoor = function(obj){ groups: obj.groups, desc: obj.desc, texture: texture + ".png", - onuse: (x, y) => { - if(! dragonblocks.getNode(x, y) || dragonblocks.getNode(x, y).stable || ! dragonblocks.getNode(x, y - 1) || dragonblocks.getNode(x, y - 1).stable) + onuse: (map, x, y) => { + if(! map.getNode(x, y) || map.getNode(x, y).stable || ! map.getNode(x, y - 1) || map.getNode(x, y - 1).stable) return false; - dragonblocks.setNode(x, y - 1, name + "_front_upper"); - dragonblocks.setNode(x, y, name + "_front_downer"); + map.setNode(x, y - 1, name + "_front_upper"); + map.setNode(x, y, name + "_front_downer"); dragonblocks.items[name].playSound("place"); return true; }, @@ -31,14 +31,14 @@ doors.registerDoor = function(obj){ hardness: obj.hardness, desc: obj.desc, texture: texture + "_front_upper.png", - ondig: (x, y) => { - if(dragonblocks.getNode(x, y + 1) && dragonblocks.getNode(x, y + 1).name == name + "_front_downer") - dragonblocks.setNode(x, y + 1, "air"); + ondig: (map, x, y) => { + if(map.getNode(x, y + 1) && map.getNode(x, y + 1).name == name + "_front_downer") + map.setNode(x, y + 1, "air"); }, - onclick: (x, y) => { - if(dragonblocks.getNode(x, y + 1) && dragonblocks.getNode(x, y + 1).name == name + "_front_downer") - dragonblocks.setNode(x, y + 1, name + "_side_downer"); - dragonblocks.setNode(x, y, name + "_side_upper"); + onclick: (map, x, y) => { + if(map.getNode(x, y + 1) && map.getNode(x, y + 1).name == name + "_front_downer") + map.setNode(x, y + 1, name + "_side_downer"); + map.setNode(x, y, name + "_side_upper"); dragonblocks.playSound(sound + "_close.ogg"); }, drops: name, @@ -52,14 +52,14 @@ doors.registerDoor = function(obj){ hardness: obj.hardness, desc: obj.desc, texture: texture + "_front_downer.png", - ondig: (x, y) => { - if(dragonblocks.getNode(x, y - 1) && dragonblocks.getNode(x, y - 1).name == name + "_front_upper") - dragonblocks.setNode(x, y - 1, "air"); + ondig: (map, x, y) => { + if(map.getNode(x, y - 1) && map.getNode(x, y - 1).name == name + "_front_upper") + map.setNode(x, y - 1, "air"); }, - onclick: (x, y) => { - if(dragonblocks.getNode(x, y - 1) && dragonblocks.getNode(x, y - 1).name == name + "_front_upper") - dragonblocks.setNode(x, y - 1, name + "_side_upper"); - dragonblocks.setNode(x, y, name + "_side_downer"); + onclick: (map, x, y) => { + if(map.getNode(x, y - 1) && map.getNode(x, y - 1).name == name + "_front_upper") + map.setNode(x, y - 1, name + "_side_upper"); + map.setNode(x, y, name + "_side_downer"); dragonblocks.playSound(sound + "_close.ogg"); }, drops: name, @@ -72,14 +72,14 @@ doors.registerDoor = function(obj){ hardness: obj.hardness, desc: obj.desc, texture: texture + "_side.png", - ondig: (x, y) => { - if(dragonblocks.getNode(x, y + 1) && dragonblocks.getNode(x, y + 1).name == name + "_side_downer") - dragonblocks.setNode(x, y + 1, "air"); + ondig: (map, x, y) => { + if(map.getNode(x, y + 1) && map.getNode(x, y + 1).name == name + "_side_downer") + map.setNode(x, y + 1, "air"); }, - onclick: (x, y) => { - if(dragonblocks.getNode(x, y + 1) && dragonblocks.getNode(x, y + 1).name == name + "_side_downer") - dragonblocks.setNode(x, y + 1, name + "_front_downer"); - dragonblocks.setNode(x, y, name + "_front_upper"); + onclick: (map, x, y) => { + if(map.getNode(x, y + 1) && map.getNode(x, y + 1).name == name + "_side_downer") + map.setNode(x, y + 1, name + "_front_downer"); + map.setNode(x, y, name + "_front_upper"); dragonblocks.playSound(sound + "_open.ogg"); }, drops: name, @@ -92,14 +92,14 @@ doors.registerDoor = function(obj){ hardness: obj.hardness, desc: obj.desc, texture: texture + "_side.png", - ondig: (x, y) => { - if(dragonblocks.getNode(x, y - 1) && dragonblocks.getNode(x, y - 1).name == name + "_side_upper") - dragonblocks.setNode(x, y - 1, "air"); + ondig: (map, x, y) => { + if(map.getNode(x, y - 1) && map.getNode(x, y - 1).name == name + "_side_upper") + map.setNode(x, y - 1, "air"); }, - onclick: (x, y) => { - if(dragonblocks.getNode(x, y - 1) && dragonblocks.getNode(x, y - 1).name == name + "_side_upper") - dragonblocks.setNode(x, y - 1, name + "_front_upper"); - dragonblocks.setNode(x, y, name + "_front_downer"); + onclick: (map, x, y) => { + if(map.getNode(x, y - 1) && map.getNode(x, y - 1).name == name + "_side_upper") + map.setNode(x, y - 1, name + "_front_upper"); + map.setNode(x, y, name + "_front_downer"); dragonblocks.playSound(sound + "_open.ogg"); }, drops: name, @@ -133,8 +133,8 @@ doors.registerTrapdoor = function(obj){ hardness: obj.hardness, desc: obj.desc, texture: texture + ".png", - onclick: (x, y) => { - dragonblocks.setNode(x, y, name + "_closed"); + onclick: (map, x, y) => { + map.setNode(x, y, name + "_closed"); dragonblocks.playSound(sound + "_close.ogg"); }, stacksize: obj.stacksize, @@ -146,8 +146,8 @@ doors.registerTrapdoor = function(obj){ hardness: obj.hardness, desc: obj.desc, texture: texture + "_closed.png", - onclick: (x, y) => { - dragonblocks.setNode(x, y, name); + onclick: (map, x, y) => { + map.setNode(x, y, name); dragonblocks.playSound(sound + "_open.ogg"); }, drops: name, diff --git a/game/fire/init.js b/game/fire/init.js index 0d8c5fb..3f39131 100644 --- a/game/fire/init.js +++ b/game/fire/init.js @@ -10,12 +10,12 @@ fire.playBurnSound = function(){ }; audio.play(); } -fire.catchfire = function(x, y){ - let mapNode = dragonblocks.getNode(x, y); +fire.catchfire = function(map, x, y){ + let mapNode = map.getNode(x, y); if(mapNode && mapNode.toNode().flammable){ if(mapNode.toNode().onfire && mapNode.toNode().onfire(x, y) == false) return; - dragonblocks.player.place(x, y - 1, "fire:fire"); + dragonblocks.player.place(map, x, y - 1, "fire:fire"); } } dragonblocks.registerGroup({ @@ -33,26 +33,26 @@ dragonblocks.registerNode({ dug: "fire_dug.ogg", place: "", }, - onset : (x, y) => { - let meta = dragonblocks.getNode(x, y).meta; + onset: (map, x, y) => { + let meta = map.getNode(x, y).meta; meta.fireInterval = setInterval(_ => { if(dblib.random(0, 6) == 0); fire.playBurnSound(); for(let ix = x - 1; ix <= x + 1; ix++){ for(let iy = y - 1; iy <= y + 2; iy++){ if(dblib.random(0, 3) == 0) - fire.catchfire(ix, iy); + fire.catchfire(map, ix, iy); } } - if(! dragonblocks.getNode(x, y + 1) || ! dragonblocks.getNode(x, y + 1).toNode().inGroup("flammable")){ - if(dblib.random(0, 20) == 0) - dragonblocks.setNode(x, y, "air"); + if (! map.getNode(x, y + 1) || ! map.getNode(x, y + 1).toNode().inGroup("flammable")) { + if (dblib.random(0, 20) == 0) + map.setNode(x, y, "air"); + } else if (dblib.random(0, map.getNode(x, y + 1).toNode().hardness * 2) == 0) { + dragonblocks.player.dig(map, x, y + 1); } - else if(dblib.random(0, dragonblocks.getNode(x, y + 1).toNode().hardness * 2) == 0) - dragonblocks.player.dig(x, y + 1); }, 1000); }, - onremove : (x, y) => { - clearInterval(dragonblocks.getNode(x, y).meta.fireInterval); + onremove: (map, x, y) => { + clearInterval(map.getNode(x, y).meta.fireInterval); } }); diff --git a/game/furnace/itemdef.js b/game/furnace/itemdef.js index c4789be..4c0135c 100644 --- a/game/furnace/itemdef.js +++ b/game/furnace/itemdef.js @@ -5,14 +5,14 @@ dragonblocks.registerNode({ hardness: 10, desc: "Furnace", stable: true, - onset: (x, y) => { - let meta = dragonblocks.getNode(x, y).meta; + onset: (map, x, y) => { + let meta = map.getNode(x, y).meta; meta.inventory = new furnace.Inventory(); if(meta.inventoryString) meta.inventory.ceserialize(meta.inventoryString); }, - onclick: (x, y) => { - let meta = dragonblocks.getNode(x, y).meta; + onclick: (map, x, y) => { + let meta = map.getNode(x, y).meta; dragonblocks.player.setInventoryElements([meta.inventory, dragonblocks.player.tmp.mainInventory]); dragonblocks.player.openInventory(); dragonblocks.player.onNextInventoryClose = _ => { @@ -20,8 +20,8 @@ dragonblocks.registerNode({ meta.inventoryString = meta.inventory.serialize(); }; }, - ondig: (x, y) => { - return dragonblocks.getNode(x, y).meta.inventory.isEmpty(); + ondig: (map, x, y) => { + return map.getNode(x, y).meta.inventory.isEmpty(); }, }); for(let i = 0; i < 6; i++){ diff --git a/game/plants/api.js b/game/plants/api.js index 3ceddcb..2de38da 100644 --- a/game/plants/api.js +++ b/game/plants/api.js @@ -17,7 +17,7 @@ plants.registerTree = function(obj){ let texture = "plants_" + obj.name; obj.tree.replace("leaves", name + "_leaves"); obj.tree.replace("tree", name + "_tree"); - obj.tree.addFunction((node, x, y) => { + obj.tree.addFunction((node, map, x, y) => { if(node.stable && node.name != name + "_sapling") return false; }); @@ -28,14 +28,16 @@ plants.registerTree = function(obj){ texture: texture + "_sapling.png", groups: ["snappy"], hardness: 2, - onset: (x, y) => { - dragonblocks.setTimer("growTimer", dblib.random(obj.growtimeMin, obj.growtimeMax), _ => {obj.tree.apply(x, y);}, dragonblocks.getNode(x, y).meta); + onset: (map, x, y) => { + dragonblocks.setTimer("growTimer", dblib.random(obj.growtimeMin, obj.growtimeMax), _ => { + obj.tree.apply(map, x, y); + }, map.getNode(x, y).meta); }, - onremove: (x, y) => { - dragonblocks.clearTimer("growTimer", dragonblocks.getNode(x, y).meta); + onremove: (map, x, y) => { + dragonblocks.clearTimer("growTimer", map.getNode(x, y).meta); }, - onplace: (x, y) => { - if(dragonblocks.getNode(x, y + 1) && ! dragonblocks.getNode(x, y + 1).toNode().inGroup("dirt")) + onplace: (map, x, y) => { + if(map.getNode(x, y + 1) && ! map.getNode(x, y + 1).toNode().inGroup("dirt")) return false; }, desc: obj.desc + " " + obj.saplingName, @@ -53,8 +55,10 @@ plants.registerTree = function(obj){ desc: obj.desc + " " + obj.treeName, stacksize: obj.stacksize, flammable: true, - onplace: (x, y) => { - setTimeout(_ => {dragonblocks.getNode(x, y).mobstable = true}) + onplace: (map, x, y) => { + setTimeout(_ => { + map.getNode(x, y).mobstable = true; + }); } }); dragonblocks.registerNode({ @@ -106,35 +110,35 @@ plants.registerSimple = function(obj){ groups: obj.groups, hardness: obj.hardness, desc: obj.desc || dblib.humanFormat(obj.name), - onset: (x, y) => { - let meta = dragonblocks.getNode(x, y).meta; + onset: (map, x, y) => { + let meta = map.getNode(x, y).meta; meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax); meta.growInterval = setInterval(_ => { - if(! dragonblocks.getNode(x, y - 1) || dragonblocks.getNode(x, y - 1).stable) + if(! map.getNode(x, y - 1) || map.getNode(x, y - 1).stable) return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax); let iy = y + 1; while(true){ - if(! dragonblocks.getNode(x, iy)) + if(! map.getNode(x, iy)) return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax); else if(iy == y + obj.maxHeight) return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax); - else if(! dragonblocks.itemMatch(obj.growOn, dragonblocks.getNode(x, iy))) + else if(! dragonblocks.itemMatch(obj.growOn, map.getNode(x, iy))) break; - else if(dragonblocks.getNode(x, iy).name == name) + else if(map.getNode(x, iy).name == name) iy++; else return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax); } meta.growTime--; if(meta.growTime <= 0) - dragonblocks.setNode(x, y - 1, name); + map.setNode(x, y - 1, name); }, 1000); }, - onremove: (x, y) => { - clearInterval(dragonblocks.getNode(x, y).meta.growInterval); + onremove: (map, x, y) => { + clearInterval(map.getNode(x, y).meta.growInterval); }, - ondig: (x, y) => { - if(obj.dropAbove && dragonblocks.getNode(x, y - 1) && dragonblocks.getNode(x, y - 1).name == name) + ondig: (map, x, y) => { + if(obj.dropAbove && map.getNode(x, y - 1) && map.getNode(x, y - 1).name == name) dragonblocks.player.digEnd(x, y - 1); }, stacksize: obj.stacksize, diff --git a/game/tnt/init.js b/game/tnt/init.js index 720af3d..ce9a1ac 100644 --- a/game/tnt/init.js +++ b/game/tnt/init.js @@ -6,18 +6,20 @@ tnt.explosion = new dragonblocks.Schematic([ ["air", "air", "air", "air", "air"], ["", "air", "air", "air", ""], ]); -tnt.explosion.addFunction((node, x, y) => { - if(node.onblast && node.onblast(x, y) == false) +tnt.explosion.addFunction((node, map, x, y) => { + if(node.onblast && node.onblast(map, x, y) == false) return false; return dblib.random(0, 100) < 90; }); -tnt.ignite = function(x, y, time){ - dragonblocks.setTimer("tntTimer", time, _ => {tnt.explode(x, y)}, dragonblocks.getNode(x, y).meta); +tnt.ignite = function(map, x, y, time){ + dragonblocks.setTimer("tntTimer", time, _ => { + tnt.explode(map, x, y); + }, map.getNode(x, y).meta); } -tnt.explode = function(x, y){ - dragonblocks.setNode(x, y, "air"); +tnt.explode = function(map, x, y){ + map.setNode(x, y, "air"); dragonblocks.playSound("tnt_explode.ogg"); - tnt.explosion.apply(x, y); + tnt.explosion.apply(map, x, y); } dragonblocks.registerNode({ name: "tnt:tnt", @@ -28,16 +30,15 @@ dragonblocks.registerNode({ texture: "tnt_tnt.png", onfire: (x, y) => { dragonblocks.playSound("tnt_ignite.ogg"); - dragonblocks.setNode(x, y, "tnt:active_tnt"); + map.setNode(x, y, "tnt:active_tnt"); }, - onblast: (x, y) => { - dragonblocks.playSound("tnt_ignite.ogg"); - tnt.ignite(x, y, 0.1); + onblast: (map, x, y) => { + tnt.ignite(map, x, y, 0.1); }, - onclick: (x, y) => { + onclick: (map, x, y) => { if(dragonblocks.player.getWieldedItem().item == "torch:torch"){ dragonblocks.playSound("tnt_ignite.ogg"); - dragonblocks.setNode(x, y, "tnt:active_tnt"); + map.setNode(x, y, "tnt:active_tnt"); } }, flammable: true @@ -49,8 +50,8 @@ dragonblocks.registerNode({ stable: true, desc: "TNT (active)", texture: "tnt_active_tnt.png", - onset: (x, y) => { - tnt.ignite(x, y, 4); + onset: (map, x, y) => { + tnt.ignite(map, x, y, 4); }, ondig: _ => { return false; @@ -68,9 +69,9 @@ dragonblocks.registerNode({ mobstable: false, desc: "Gunpowder", texture: "tnt_gunpowder.png", - onclick: (x, y) => { + onclick: (map, x, y) => { if(dragonblocks.player.getWieldedItem().item == "torch:torch_floor") - dragonblocks.setNode(x, y, "tnt:active_gunpowder"); + map.setNode(x, y, "tnt:active_gunpowder"); }, hidden: true, }); @@ -83,25 +84,25 @@ dragonblocks.registerNode({ desc: "Gunpowder (active)", texture: "tnt_active_gunpowder.png", drops: "tnt:gunpowder", - onset: (x, y) => { - let meta = dragonblocks.getNode(x, y).meta; + onset: (map, x, y) => { + let meta = map.getNode(x, y).meta; meta.gunpowderTime = 1; meta.gunpowderInterval = setInterval(_ => { meta.gunpowderTime -= 0.1; if(meta.gunpowderTime <= 0){ - dragonblocks.setNode(x, y, "air"); + map.setNode(x, y, "air"); for(let [ix, iy] of [[x - 1, y], [x + 1, y], [x, y - 1], [x, y + 1]]){ - if(dragonblocks.getNode(ix, iy).name == "tnt:gunpowder") - dragonblocks.setNode(ix, iy, "tnt:active_gunpowder"); - else if(dragonblocks.getNode(ix, iy).name == "tnt:tnt") - tnt.ignite(ix, iy, tnt.time); + if(map.getNode(ix, iy).name == "tnt:gunpowder") + map.setNode(ix, iy, "tnt:active_gunpowder"); + else if(map.getNode(ix, iy).name == "tnt:tnt") + tnt.ignite(map, ix, iy, tnt.time); } clearInterval(meta.gunpowderInterval); } }, 100); }, - onremove: (x, y) => { - clearInterval(dragonblocks.getNode(x, y).meta.gunpowderInterval); + onremove: (map, x, y) => { + clearInterval(map.getNode(x, y).meta.gunpowderInterval); }, hidden: true }); diff --git a/game/torch/init.js b/game/torch/init.js index 418d7be..956996f 100644 --- a/game/torch/init.js +++ b/game/torch/init.js @@ -1,24 +1,24 @@ torch = {}; torch.directions = ["floor", "left", "right", "ceiling"]; -torch.check = function(direction, x, y){ +torch.check = function(direction, map, x, y){ switch(direction){ case "floor": - return ! dragonblocks.getNode(x, y + 1) || dragonblocks.getNode(x, y + 1).stable; + return ! map.getNode(x, y + 1) || map.getNode(x, y + 1).stable; case "left": - return ! dragonblocks.getNode(x - 1, y) || dragonblocks.getNode(x - 1, y).stable; + return ! map.getNode(x - 1, y) || map.getNode(x - 1, y).stable; case "right": - return ! dragonblocks.getNode(x + 1, y) || dragonblocks.getNode(x + 1, y).stable; + return ! map.getNode(x + 1, y) || map.getNode(x + 1, y).stable; case "ceiling": - return ! dragonblocks.getNode(x, y - 1) || dragonblocks.getNode(x, y - 1).stable; + return ! map.getNode(x, y - 1) || map.getNode(x, y - 1).stable; } } dragonblocks.registerItem({ name: "torch:torch", desc: "Torch", texture: "torch_torch_floor.png", - onuse: (x, y) => { + onuse: (map, x, y) => { for(let direction of torch.directions) - if(dragonblocks.player.place(x, y, dragonblocks.nodes["torch:torch_" + direction])) + if(dragonblocks.player.place(map, x, y, dragonblocks.nodes["torch:torch_" + direction])) return true; } }); @@ -33,12 +33,12 @@ for(let direction of torch.directions){ texture: "torch_torch_" + direction + ".png", groups:["snappy"], hidden: true, - onactivate: (x, y) => { - if(! torch.check(direction, x, y)) - dragonblocks.setNode(x, y, "air"); + onactivate: (map, x, y) => { + if(! torch.check(direction, map, x, y)) + map.setNode(x, y, "air"); }, - onplace: (x, y) => { - if(! torch.check(direction, x, y)) + onplace: (map, x, y) => { + if(! torch.check(direction, map, x, y)) return false; } }); diff --git a/game/wool/init.js b/game/wool/init.js index 604a029..df0d255 100644 --- a/game/wool/init.js +++ b/game/wool/init.js @@ -1,4 +1,4 @@ -var wool = {}; +wool = {}; wool.colors = ["black", "blue", "brown", "cyan", "dark_green", "dark_grey", "green", "grey", "magenta", "orange", "pink", "red", "violet", "white", "yellow"]; for(let color of wool.colors){ dragonblocks.registerNode({ diff --git a/index.html b/index.html index 7343787..a4f30d4 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,8 @@ - + +