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.Inventory = class{
24 constructor(slots, columns){
25 this.id = dragonblocks.getToken();
27 this.columns = columns;
29 for(let i = 0; i < this.slots; i++){
30 this.list[i] = new dragonblocks.createItemstack();
36 for(let stack of this.list)
37 str += stack.stringify() + ",";
41 for(let i in this.list)
42 this.list[i].parse(str.split(",")[i]);
45 var itemstack = dragonblocks.createItemstack(itemstring);
46 for(let stack of this.list)
47 stack.item == itemstack.item && stack.add(itemstack);
48 for(let stack of this.list)
53 for(let stack of this.list)
58 addUpdateListener(func){
59 for(let stack of this.list)
60 stack.addUpdateListener(func);
63 for(let stack of this.list)
66 calculateWidth(columns){
67 return dragonblocks.settings.inventory.scale * 1.1 * this.columns + (dragonblocks.settings.inventory.scale * 0.1);
70 return dragonblocks.settings.inventory.scale * 1.1 * Math.ceil(this.slots/this.columns) + dragonblocks.settings.inventory.scale * 0.1
74 if(this.getDisplay().parentElement != parent)
77 this.getDisplay().style.left = x + "px";
78 this.getDisplay().style.top = y + "px";
82 let display = document.createElement("div");
83 display.id = "dragonblocks.inventory[" + this.id + "]";
84 display.style.position = "absolute";
85 display.style.left = x + "px";
86 display.style.top = y + "px";
87 display.style.width = this.calculateWidth() + "px";
88 display.style.height = this.calculateHeight() + "px";
89 for(let i in this.list){
90 let x = i % this.columns;
91 let y = (i - x) / this.columns;
92 dragonblocks.Inventory.drawStack(display, dragonblocks.settings.inventory.scale * 0.1 + x * dragonblocks.settings.inventory.scale * 1.1, dragonblocks.settings.inventory.scale * 0.1 + y * dragonblocks.settings.inventory.scale * 1.1, this.list[i]);
94 parent.appendChild(display);
99 dblib.remove(this.getDisplay());
100 this.display = false;
103 this.getDisplay().style.visibility = "inherit";
107 this.getDisplay().style.visibility = "hidden";
110 for(let stack of this.list)
117 return document.getElementById("dragonblocks.inventory[" + this.id + "]");
119 static drawStack(parent, x, y, stack){
120 let stackDisplay = document.createElement("div");
121 stackDisplay.id = "dragonblocks.itemstack[" + stack.id + "]";
122 stackDisplay.stackid = stack.id;
123 stackDisplay.style.borderStyle = "solid";
124 stackDisplay.style.borderWidth = "1px";
125 stackDisplay.style.borderColor = "#2D2D2D";
126 stackDisplay.style.width = dragonblocks.settings.inventory.scale + "px";
127 stackDisplay.style.height = dragonblocks.settings.inventory.scale + "px";
128 stackDisplay.style.backgroundColor = "#343434";
129 stackDisplay.style.position = "absolute";
130 stackDisplay.style.left = x + "px";
131 stackDisplay.style.top = y + "px";
132 stackDisplay.addEventListener("mousedown", event => {
133 let out = dragonblocks.Inventory.out;
135 return stack.action(out, event.which);
139 stack.add(out) || stack.swap(out);
145 stack.addOne(out) || stack.swap(out);
150 stackDisplay.addEventListener("mouseover", event => {
151 stack.focused = true;
152 dragonblocks.Inventory.redrawStack(stack);
154 stackDisplay.addEventListener("mouseleave", event => {
155 stack.focused = false;
156 dragonblocks.Inventory.redrawStack(stack);
158 let stackDisplayCount = document.createElement("span");
159 stackDisplayCount.id = "dragonblocks.itemstack[" + stack.id + "].count";
160 stackDisplayCount.stackid = stack.id;
161 stackDisplayCount.style.position = "absolute";
162 stackDisplayCount.style.right = "5px";
163 stackDisplayCount.style.bottom = "5px";
164 stackDisplayCount.style.color = "white";
165 stackDisplayCount.style.cursor = "default";
166 stackDisplay.appendChild(stackDisplayCount);
167 parent.appendChild(stackDisplay);
168 stack.addUpdateListener(_ => {
169 dragonblocks.Inventory.redrawStack(stack);
173 static redrawStack(stack){
174 let stackDisplay = document.getElementById("dragonblocks.itemstack[" + stack.id + "]");
177 let stackDisplayCount = document.getElementById("dragonblocks.itemstack[" + stack.id + "].count");
178 stackDisplay.title = "";
179 stackDisplay.style.background = "none";
180 stackDisplayCount.innerHTML = "";
182 stackDisplay.style.background = dragonblocks.getTexture(stack.toItem().texture);
183 stackDisplay.style.backgroundSize = "cover";
184 stackDisplay.title = stack.toItem().desc;
186 stackDisplayCount.innerHTML = stack.count;
188 stackDisplay.style.backgroundColor = "#343434";
190 stackDisplay.style.backgroundColor = "#7E7E7E";
194 static getStackDisplay(id){
195 return document.getElementById("dragonblocks.itemstack[" + id + "]");
197 static insertElement(elem){
198 document.body.insertBefore(elem, dragonblocks.Inventory.getStackDisplay(dragonblocks.Inventory.out.id));
201 setTimeout((function(){
202 let out = dragonblocks.Inventory.out = new dragonblocks.createItemstack();
203 dragonblocks.Inventory.drawStack(document.body, 0, 0, out);
204 dragonblocks.Inventory.getStackDisplay(out.id).style.position = "fixed";
205 out.addUpdateListener(_ => {
206 dragonblocks.Inventory.redrawStack(out);
208 out.onredraw = _ => {
209 dragonblocks.Inventory.getStackDisplay(out.id).style.backgroundColor = "";
210 dragonblocks.Inventory.getStackDisplay(out.id).style.border = "none";
212 addEventListener("mousemove", event => {
213 dragonblocks.Inventory.getStackDisplay(out.id).style.left = event.clientX + 5 + "px";
214 dragonblocks.Inventory.getStackDisplay(out.id).style.top = event.clientY + 5 + "px";