4 * Copyright 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
23 dragonblocks.MapIntercation = {
26 let crack = document.createElement("div");
27 crack.id = "dragonblocks.crack[" + this.id + "]";
28 crack.style.position = "absolute";
29 crack.style.visibility = "hidden";
30 crack.style.backgroundSize = "cover";
31 crack.style.height = dragonblocks.settings.map.scale + "px";
32 crack.style.width = dragonblocks.settings.map.scale + "px";
33 crack.style.boxShadow = "0 0 0 1px black inset";
34 crack.style.zIndex = 2;
35 crack.addEventListener("mouseleave", event => {
37 let [x, y] = dragonblocks.map.getCoordinate(event.srcElement.offsetLeft, event.srcElement.offsetTop);
38 dragonblocks.map.getNodeGraphics(x, y).style.boxShadow = "none";
40 crack.addEventListener("mouseover", event => {
41 let [x, y] = dragonblocks.map.getCoordinate(event.srcElement.offsetLeft + document.getElementById("dragonblocks.map").offsetLeft, event.srcElement.offsetTop + document.getElementById("dragonblocks.map").offsetTop);
42 dragonblocks.map.getNodeGraphics(x, y).style.boxShadow = "0 0 0 1px black inset";
44 document.getElementById("dragonblocks.map").appendChild(crack);
47 let mapNode = dragonblocks.getNode(x, y);
50 let node = mapNode.toNode();
51 if(node.ondig && node.ondig(x, y) == false)
53 for(let func of dragonblocks.onDigNodeFunctions)
54 if(func(x, y) == false)
56 node.playSound("dug");
57 dragonblocks.setNode(x, y, "air");
58 dragonblocks.map.activate(x, y);
62 let mapNode = dragonblocks.getNode(x, y);
63 let node = mapNode.toNode();
64 mapNode.meta.hardness = node.hardness;
65 mapNode.meta.causedDamage = 0;
66 if(! this.canReach(x, y))
68 let crack = document.getElementById("dragonblocks.crack[" + this.id + "]")
69 crack.style.visibility = "visible";
70 crack.style.left = (x - dragonblocks.map.displayLeft) * dragonblocks.settings.map.scale + "px";
71 crack.style.top = (y - dragonblocks.map.displayTop) * dragonblocks.settings.map.scale + "px";
72 dragonblocks.log("Punched Node at (" + x + ", " + y + ")");
73 node.onpunch && node.onpunch(x,y);
74 for(let func of dragonblocks.onPunchNodeFunctions)
76 dragonblocks.map.activate(x, y);
81 let mapNode = dragonblocks.getNode(x, y);
84 let node = mapNode.toNode();
85 let damage = this.tool.calculateDamage(node);
87 damage = this.tmp.defaultTool.calculateDamage(node);
88 mapNode.meta.hardness -= damage;
89 mapNode.meta.causedDamage += damage;
90 if(mapNode.meta.hardness <= 0 || isNaN(mapNode.meta.hardness))
93 node.playSound("dig");
94 let crack = document.getElementById("dragonblocks.crack[" + this.id + "]");
95 crack.style.background = dragonblocks.getTexture("crack" + Math.floor(mapNode.meta.causedDamage / mapNode.toNode().hardness * 5) + ".png");
96 crack.style.backgroundSize = "cover";
97 this.tmp.digTimeout = setTimeout(_ => { self.digTick(x, y) }, this.tool.interval);
101 let mapNode = dragonblocks.getNode(x, y);
104 let node = mapNode.toNode();
106 if(node.drops instanceof Function)
107 this.tmp.mainInventory.add(node.drops());
109 this.tmp.mainInventory.add(node.drops);
111 document.getElementById("dragonblocks.crack[" + this.id + "]").style.visibility = "hidden";
114 clearTimeout(this.tmp.digTimeout);
115 document.getElementById("dragonblocks.crack[" + this.id + "]").style.visibility = "hidden";
118 if(! dragonblocks.getNode(x, y) || dragonblocks.getNode(x, y).stable)
120 if(node.onplace && node.onplace(x, y) == false)
122 for(let func of dragonblocks.onPlaceNodeFunctions)
123 if(func(node, x, y) == false)
125 dragonblocks.setNode(x, y, node);
126 dragonblocks.map.activate(x, y);
127 node.playSound("place");
131 if(this.canReach(x, y)){
132 let old = dragonblocks.getNode(x, y).toNode();
133 old.onclick && old.onclick(x, y);
134 for(let func of dragonblocks.onClickNodeFunctions)
138 var buildstack = dragonblocks.createItemstack();
139 if(! buildstack.addOne(this.getWieldedItem()))
141 if(buildstack.toItem() instanceof dragonblocks.Node){
142 if(! this.place(x, y, buildstack.toItem()) || this.meta.creative)
143 this.getWieldedItem().add(buildstack);
146 if(! buildstack.toItem().onuse || ! buildstack.toItem().onuse(x, y))
147 this.getWieldedItem().add(buildstack);
149 for(let func of dragonblocks.onUseItemFunctions)
150 func(buildstack.toItem(), x, y);
151 if(this.meta.creative)
152 this.getWieldedItem().add(buildstack);
158 return (Math.sqrt(Math.pow(x - this.x, 2) + Math.pow(y - this.y, 2)) <= this.tool.range) || this.meta.creative;