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.registerTool({
24 name: "dragonblocks:hand",
37 dragonblocks.registerTool({
38 name: "dragonblocks:creative_hand",
47 dragonblocks.registerEntity({
48 name: "dragonblocks:player",
52 horizontalSpeed: dragonblocks.settings.player.speed,
53 verticalSpeed: dragonblocks.settings.player.jumpspeed,
55 skin: dragonblocks.settings.player.defaultSkin,
60 dragonblocks.Player = class extends dragonblocks.SpawnedEntity
62 constructor(data, map)
67 super(dragonblocks.entities["dragonblocks:player"], map, map.width / 2, 5);
72 this.skin = this.meta.skin;
75 this.tmp.inventory = new dragonblocks.InventoryGroup(); // Create inventory group that can hold multiple inventories
78 this.tmp.mainInventory = new dragonblocks.Inventory(32, 8); // The main Inventory
80 if (this.meta.mainInventory)
81 this.tmp.mainInventory.deserialize(this.meta.mainInventory); // Load saved Inventory
83 this.tmp.mainInventory.addEventListener("updateStack", event => {
84 self.meta.mainInventory = this.tmp.mainInventory.serialize(); // Save inventory after every change
86 if (self.gamemode == "creative" && event.stack.count > 1) // Keep count of every stack at one when in creative
87 event.stack.count = 1;
90 this.tmp.mainInventory.addEventListener("updateStack", _ => {
92 self.tmp.hudbar.update();
96 this.tmp.hudbar = new dragonblocks.Hudbar(this.tmp.mainInventory, 8); // The hudbar has 8 slots
99 let creativelist = [];
101 dragonblocks.registeredItems.filter(item => {
102 return ! item.hidden;
104 creativelist.push(item.name);
107 this.tmp.creativeInventory = new dragonblocks.CreativeInventory(32, creativelist, 8); // The creative Inventory contains every registered item that is not marked as hidden
109 // Survival Inventory
110 this.tmp.survivalInventory = new dragonblocks.InventoryContainer({
111 inventory: new dragonblocks.Craftfield(3, 3),
118 if (this.meta.survivalInventory)
119 this.tmp.survivalInventory.deserialize(this.meta.survivalInventory);
121 this.tmp.survivalInventory.addEventListener("updateStack", _ => {
122 self.meta.survivalInventory = this.tmp.survivalInventory.serialize();
126 this.resetInventoryElements();
129 this.tmp.tool = null;
130 this.tmp.defaultTool = dragonblocks.tools[this.meta.creative ? "dragonblocks:creative_hand" : "dragonblocks:hand"];
131 this.initMapInteraction();
135 if (map.displayLeft + map.displayWidth < self.x + self.width + 3)
136 map.displayLeft = parseInt(self.x + self.width + 3 - map.displayWidth);
137 else if (map.displayLeft > self.x - 2)
138 map.displayLeft = parseInt(self.x - 2);
140 if (map.displayTop + map.displayHeight < self.y + self.height + 3)
141 map.displayTop = parseInt(self.y + self.height + 3 - map.displayHeight);
142 else if (map.displayTop > self.y - 2)
143 map.displayTop = parseInt(self.y - 2);
145 map.updateGraphics();
149 dragonblocks.keyHandler.down(" ", _ => {
153 dragonblocks.keyHandler.up(" ", _ => {
157 dragonblocks.keyHandler.down("w", _ => {
161 dragonblocks.keyHandler.up("w", _ => {
165 dragonblocks.keyHandler.down("ArrowLeft", _ => {
169 dragonblocks.keyHandler.down("ArrowRight", _ => {
173 dragonblocks.keyHandler.down("a", _ => {
177 dragonblocks.keyHandler.down("d", _ => {
181 dragonblocks.keyHandler.up("ArrowLeft", _ => {
185 dragonblocks.keyHandler.up("ArrowRight", _ => {
189 dragonblocks.keyHandler.up("a", _ => {
193 dragonblocks.keyHandler.up("d", _ => {
197 dragonblocks.keyHandler.down("i", _ => {
198 self.toggleInventory();
201 dragonblocks.keyHandler.down("n", _ => {
205 dragonblocks.keyHandler.down("b", _=> {
209 dragonblocks.keyHandler.down("scroll", _ => {
213 dragonblocks.keyHandler.up("scroll", _=>{
217 for (let i = 1; i < 9; i++) {
218 dragonblocks.keyHandler.down(i.toString(), _ => {
223 addEventListener("mouseup", event => {
224 if (event.which == 1)
228 addEventListener("keydown", event => {
229 if (event.key == "Escape" && self.inventoryIsOpen())
230 self.closeInventory();
233 // Map Interaction Controls
234 for (let x = 0; x < map.displayWidth; x++) {
235 for (let y = 0; y < map.displayHeight; y++) {
236 let nodeDisplay = document.getElementById("dragonblocks.map.node[" + x + "][" + y + "]");
238 nodeDisplay.addEventListener("mouseover", event => {
239 if (self.canReach(x + map.displayLeft, y + map.displayTop))
240 event.srcElement.style.boxShadow = "0 0 0 1px black inset";
243 nodeDisplay.addEventListener("mouseleave", event => {
244 event.srcElement.style.boxShadow = "none";
247 nodeDisplay.addEventListener("mousedown", event => {
248 let [ix, iy] = [x + map.displayLeft, y + map.displayTop];
250 switch(event.which) {
252 self.digStart(ix, iy);
266 return dblib.removeTmp([this])[0];
271 this.meta.skin = value;
272 this.texture = dragonblocks.registeredSkins[value].texture;
273 this.updateTexture();
278 return this.meta.skin;
283 this.setGamemode(mode);
288 return this.meta.creative ? "creative" : "survival";
293 return dragonblocks.tools[this.getWieldedItem().item] || this.tmp.defaultTool;
298 switch (mode.toString().toLowerCase()) {
301 this.meta.creative = false;
306 this.meta.creative = true;
313 this.resetInventoryElements();
314 this.tmp.defaultTool = dragonblocks.tools[this.meta.creative ? "dragonblocks:creative_hand" : "dragonblocks:hand"];
321 return this.tmp.inventory.opened;
326 this.tmp.inventory.open();
327 dragonblocks.keyHandler.lockAll();
328 dragonblocks.keyHandler.unlock("i");
329 dragonblocks.gui.showLayer();
334 this.tmp.inventory.close();
335 dragonblocks.keyHandler.unlockAll();
336 dragonblocks.gui.hideLayer();
341 this.inventoryIsOpen() ? this.closeInventory() : this.openInventory();
346 return this.tmp.mainInventory.add(itemstring);
351 this.tmp.mainInventory.clear();
354 setInventoryElements(elems)
356 this.tmp.inventory.elements = elems;
359 resetInventoryElements()
361 let elems = [this.tmp.mainInventory];
362 elems.unshift(this.gamemode == "creative" ? this.tmp.creativeInventory : this.tmp.survivalInventory);
363 this.setInventoryElements(elems);
368 this.tmp.hudbar.previousItem();
373 this.tmp.hudbar.nextItem();
378 this.tmp.hudbar.select(i);
383 return this.tmp.hudbar.getSelectedItem();
386 set onNextInventoryClose(func)
388 this.tmp.inventory.onNextClose = func;
392 Object.assign(dragonblocks.Player.prototype, dragonblocks.MapInteraction); // Mixin