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.hotbar.update();
96 this.tmp.hotbar = new dragonblocks.Hotbar(this.tmp.mainInventory, 8); // The hotbar 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();
134 dragonblocks.keyHandler.down(" ", _ => {
138 dragonblocks.keyHandler.up(" ", _ => {
142 dragonblocks.keyHandler.down("w", _ => {
146 dragonblocks.keyHandler.up("w", _ => {
150 dragonblocks.keyHandler.down("ArrowLeft", _ => {
154 dragonblocks.keyHandler.down("ArrowRight", _ => {
158 dragonblocks.keyHandler.down("a", _ => {
162 dragonblocks.keyHandler.down("d", _ => {
166 dragonblocks.keyHandler.up("ArrowLeft", _ => {
170 dragonblocks.keyHandler.up("ArrowRight", _ => {
174 dragonblocks.keyHandler.up("a", _ => {
178 dragonblocks.keyHandler.up("d", _ => {
182 dragonblocks.keyHandler.down("i", _ => {
183 self.toggleInventory();
186 dragonblocks.keyHandler.down("n", _ => {
190 dragonblocks.keyHandler.down("b", _=> {
194 dragonblocks.keyHandler.down("scroll", _ => {
198 dragonblocks.keyHandler.up("scroll", _=>{
202 for (let i = 1; i < 9; i++) {
203 dragonblocks.keyHandler.down(i.toString(), _ => {
208 addEventListener("mouseup", event => {
209 if (event.which == 1)
213 addEventListener("keydown", event => {
214 if (event.key == "Escape" && self.inventoryIsOpen())
215 self.closeInventory();
218 // Map Interaction Controls
219 for (let x = 0; x < dragonblocks.mapDisplay.width; x++) {
220 for (let y = 0; y < dragonblocks.mapDisplay.height; y++) {
221 let nodeDisplay = dragonblocks.mapDisplay.getNode(x, y);
223 nodeDisplay.addEventListener("mouseover", event => {
224 if (self.canReach(x + dragonblocks.mapDisplay.left, y + dragonblocks.mapDisplay.top))
225 event.srcElement.style.boxShadow = "0 0 0 1px black inset";
228 nodeDisplay.addEventListener("mouseleave", event => {
229 event.srcElement.style.boxShadow = "none";
232 nodeDisplay.addEventListener("mousedown", event => {
233 let [ix, iy] = [x + dragonblocks.mapDisplay.left, y + dragonblocks.mapDisplay.top];
235 switch(event.which) {
237 self.digStart(ix, iy);
251 return dblib.removeTmp([this])[0];
256 super.setMap(map, x, y);
257 this.updateMapInteractionMap();
258 dragonblocks.mapDisplay.setMap(map);
263 this.meta.skin = value;
264 this.texture = dragonblocks.registeredSkins[value].texture;
265 this.updateTexture();
270 return this.meta.skin;
275 this.setGamemode(mode);
280 return this.meta.creative ? "creative" : "survival";
285 return dragonblocks.tools[this.getWieldedItem().item] || this.tmp.defaultTool;
290 switch (mode.toString().toLowerCase()) {
293 this.meta.creative = false;
298 this.meta.creative = true;
305 this.resetInventoryElements();
306 this.tmp.defaultTool = dragonblocks.tools[this.meta.creative ? "dragonblocks:creative_hand" : "dragonblocks:hand"];
313 return this.tmp.inventory.opened;
318 this.tmp.inventory.open();
319 dragonblocks.keyHandler.lockAll();
320 dragonblocks.keyHandler.unlock("i");
321 dragonblocks.gui.showLayer();
326 this.tmp.inventory.close();
327 dragonblocks.keyHandler.unlockAll();
328 dragonblocks.gui.hideLayer();
333 this.inventoryIsOpen() ? this.closeInventory() : this.openInventory();
338 return this.tmp.mainInventory.add(itemstring);
343 this.tmp.mainInventory.clear();
346 setInventoryElements(elems)
348 this.tmp.inventory.setElements(elems);
351 resetInventoryElements()
353 this.setInventoryElements([this.gamemode == "creative" ? this.tmp.creativeInventory : this.tmp.survivalInventory, this.tmp.mainInventory]);
358 this.tmp.hotbar.previousItem();
363 this.tmp.hotbar.nextItem();
368 this.tmp.hotbar.select(i);
373 return this.tmp.hotbar.getSelectedItem();
376 set onNextInventoryClose(func)
378 this.tmp.inventory.onNextClose = func;
382 Object.assign(dragonblocks.Player.prototype, dragonblocks.MapInteraction); // Mixin