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{
63 if (dragonblocks.worldIsLoaded) {
64 super(dragonblocks.world.spawnedEntities.filter(entity => {
65 return entity.name == "dragonblocks:player";
68 dragonblocks.world.spawnedEntities = dragonblocks.world.spawnedEntities.filter(entity => {
69 return entity.name != "dragonblocks:player";
72 super(dragonblocks.entities["dragonblocks:player"], dragonblocks.map.width / 2, 5);
78 this.skin = this.meta.skin;
81 this.tmp.inventory = new dragonblocks.InventoryGroup(); // Create Inventory Group that can hold multible Inventories
84 this.tmp.mainInventory = new dragonblocks.Inventory(32, 8); // The Main Inventory
86 if (this.meta.mainInventory)
87 this.tmp.mainInventory.deserialize(this.meta.mainInventory); // Load saved Inventory
89 this.tmp.mainInventory.addEventListener("updateStack", event => {
90 self.meta.mainInventory = this.tmp.mainInventory.serialize(); // Save inventory after every change
92 if (self.gamemode == "creative" && event.stack.count > 1) // Keep itemcount of every stack at one when in creative
93 event.stack.count = 1;
96 this.tmp.mainInventory.addEventListener("updateStack", _ => {
98 self.tmp.hudbar.update();
102 this.tmp.hudbar = new dragonblocks.Hudbar(this.tmp.mainInventory, 8); // The hudbar has 8 slots
104 // Creative Inventory
105 let creativelist = [];
107 dragonblocks.registeredItems.filter(item => {
108 return ! item.hidden;
110 creativelist.push(item.name);
113 this.tmp.creativeInventory = new dragonblocks.CreativeInventory(32, creativelist, 8); // The creative Inventory contains every registered item that is not marked as hidden
115 // Survival Inventory
116 this.tmp.survivalInventory = new dragonblocks.InventoryContainer({
117 inventory: new dragonblocks.Craftfield(3, 3),
124 if (this.meta.survivalInventory)
125 this.tmp.survivalInventory.deserialize(this.meta.survivalInventory);
127 this.tmp.survivalInventory.addEventListener("updateStack", _ => {
128 self.meta.survivalInventory = this.tmp.survivalInventory.serialize();
132 this.resetInventoryElements();
135 this.tmp.tool = null;
136 this.tmp.defaultTool = dragonblocks.tools[this.meta.creative ? "dragonblocks:creative_hand" : "dragonblocks:hand"];
137 this.initMapInteraction();
141 if (dragonblocks.map.displayLeft + dragonblocks.map.displayWidth < self.x + self.width + 3)
142 dragonblocks.map.displayLeft = parseInt(self.x + self.width + 3 - dragonblocks.map.displayWidth);
143 else if (dragonblocks.map.displayLeft > self.x - 2)
144 dragonblocks.map.displayLeft = parseInt(self.x - 2);
145 if (dragonblocks.map.displayTop + dragonblocks.map.displayHeight < self.y + self.height + 3)
146 dragonblocks.map.displayTop = parseInt(self.y + self.height + 3 - dragonblocks.map.displayHeight);
147 else if (dragonblocks.map.displayTop > self.y - 2)
148 dragonblocks.map.displayTop = parseInt(self.y - 2);
150 dragonblocks.map.updateGraphics();
154 dragonblocks.keyHandler.down(" ", _ => {
158 dragonblocks.keyHandler.up(" ", _ => {
162 dragonblocks.keyHandler.down("ArrowLeft", _ => {
166 dragonblocks.keyHandler.down("ArrowRight", _ => {
170 dragonblocks.keyHandler.up("ArrowLeft", _ => {
174 dragonblocks.keyHandler.up("ArrowRight", _ => {
178 dragonblocks.keyHandler.down("i", _ => {
179 self.toggleInventory();
182 dragonblocks.keyHandler.down("n", _ => {
186 dragonblocks.keyHandler.down("b", _=> {
190 dragonblocks.keyHandler.down("scroll", _ => {
194 dragonblocks.keyHandler.up("scroll", _=>{
198 for (let i = 1; i < 9; i++) {
199 dragonblocks.keyHandler.down(i.toString(), _ => {
204 let mapDisplay = document.getElementById("dragonblocks.map");
206 addEventListener("mouseup", event => {
207 if (event.which == 1)
211 addEventListener("keydown", event => {
212 if (event.key == "Escape" && self.inventoryIsOpen())
213 self.closeInventory();
216 // Map Interaction Controls
217 for (let x = 0; x < dragonblocks.map.displayWidth; x++) {
218 for (let y = 0; y < dragonblocks.map.displayHeight; y++) {
219 let nodeDisplay = document.getElementById("dragonblocks.map.node[" + x + "][" + y + "]");
221 nodeDisplay.addEventListener("mouseover", event => {
222 if (self.canReach(x + dragonblocks.map.displayLeft, y + dragonblocks.map.displayTop))
223 event.srcElement.style.boxShadow = "0 0 0 1px black inset";
226 nodeDisplay.addEventListener("mouseleave", event => {
227 event.srcElement.style.boxShadow = "none";
230 nodeDisplay.addEventListener("mousedown", event => {
231 let [ix, iy] = [x + dragonblocks.map.displayLeft, y + dragonblocks.map.displayTop];
233 switch(event.which) {
235 self.digStart(ix, iy);
249 this.meta.skin = value;
250 this.texture = dragonblocks.registeredSkins[value].texture;
251 this.updateTexture();
256 return this.meta.skin;
261 this.setGamemode(mode);
266 return this.meta.creative ? "creative" : "survival";
271 return dragonblocks.tools[this.getWieldedItem().item] || this.tmp.defaultTool;
276 switch (mode.toString().toLowerCase()) {
279 this.meta.creative = false;
284 this.meta.creative = true;
291 this.resetInventoryElements();
292 this.tmp.defaultTool = dragonblocks.tools[this.meta.creative ? "dragonblocks:creative_hand" : "dragonblocks:hand"];
299 return this.tmp.inventory.opened;
304 this.tmp.inventory.open();
305 dragonblocks.keyHandler.lockAll();
306 dragonblocks.keyHandler.unlock("i");
307 dragonblocks.gui.showLayer();
312 this.tmp.inventory.close();
313 dragonblocks.keyHandler.unlockAll();
314 dragonblocks.gui.hideLayer();
319 this.inventoryIsOpen() ? this.closeInventory() : this.openInventory();
324 return this.tmp.mainInventory.add(itemstring);
329 this.tmp.mainInventory.clear();
332 setInventoryElements(elems)
334 this.tmp.inventory.elements = elems;
337 resetInventoryElements()
339 let elems = [this.tmp.mainInventory];
340 elems.unshift(this.gamemode == "creative" ? this.tmp.creativeInventory : this.tmp.survivalInventory);
341 this.setInventoryElements(elems);
346 this.tmp.hudbar.previousItem();
351 this.tmp.hudbar.nextItem();
356 this.tmp.hudbar.select(i);
361 return this.tmp.hudbar.getSelectedItem();
364 set onNextInventoryClose(func)
366 this.tmp.inventory.onNextClose = func;
370 Object.assign(dragonblocks.Player.prototype, dragonblocks.MapInteraction); //Mixin