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,
59 dragonblocks.Player = class extends dragonblocks.SpawnedEntity{
61 if(dragonblocks.worldIsLoaded){
62 super(dragonblocks.world.spawnedEntities.filter(entity => { return entity.name == "dragonblocks:player" })[0]);
63 dragonblocks.world.spawnedEntities = dragonblocks.world.spawnedEntities.filter(entity => { return entity.name != "dragonblocks:player" });
66 super(dragonblocks.entities["dragonblocks:player"], dragonblocks.map.width / 2, 5);
67 dragonblocks.player = this;
70 this.skin = this.meta.skin;
72 this.tmp.inventory = new dragonblocks.InventoryGroup(); // Create Inventory Group that can hold multible Inventories
74 this.tmp.mainInventory = new dragonblocks.Inventory(32, 8); // The Standard Inventory
75 for(let stack of this.tmp.mainInventory.list){
76 stack.addUpdateListener(_ => {
77 if(dragonblocks.player.gamemode == "creative" && stack.count > 1) // Keep itemcount of every stack at one when in creative
81 if(this.meta.mainInventory)
82 this.tmp.mainInventory.parse(this.meta.mainInventory); // Load saved Inventory
83 this.tmp.mainInventory.addUpdateListener(_ => {
84 self.meta.mainInventory = this.tmp.mainInventory.stringify(); // Save inventory after every change
86 this.tmp.mainInventory.addUpdateListener(_ => {
88 self.tmp.hudbar.update();
91 this.tmp.hudbar = new dragonblocks.Hudbar(this.tmp.mainInventory, 8); // The hudbar has 8 slots
93 let creativelist = [];
94 dragonblocks.registeredItems.filter(item => {return ! item.hidden}).forEach(item => {creativelist.push(item.name)});
95 this.tmp.creativeInventory = new dragonblocks.CreativeInventory(32, creativelist, 8); // The creative Inventory contains every registered item that is not marked as hidden
97 this.tmp.survivalInventory = new dragonblocks.InventoryContainer({
98 inventory: new dragonblocks.Craftfield(3, 3),
104 if(this.meta.survivalInventory)
105 this.tmp.survivalInventory.parse(this.meta.survivalInventory);
106 this.tmp.survivalInventory.addUpdateListener(_ => {
107 self.meta.survivalInventory = this.tmp.survivalInventory.stringify();
110 this.resetInventoryElements();
112 this.tmp.tool = null;
113 this.tmp.defaultTool = this.meta.creative ? dragonblocks.getTool("dragonblocks:creative_hand") : dragonblocks.getTool("dragonblocks:hand");
114 this.initMapInteraction();
117 if(dragonblocks.map.displayLeft + dragonblocks.map.displayWidth < dragonblocks.player.x + dragonblocks.player.width + 3)
118 dragonblocks.map.displayLeft = parseInt(dragonblocks.player.x + dragonblocks.player.width + 3 - dragonblocks.map.displayWidth);
119 else if(dragonblocks.map.displayLeft > dragonblocks.player.x - 2)
120 dragonblocks.map.displayLeft = parseInt(dragonblocks.player.x - 2);
121 if(dragonblocks.map.displayTop + dragonblocks.map.displayHeight < dragonblocks.player.y + dragonblocks.player.height + 3)
122 dragonblocks.map.displayTop = parseInt(dragonblocks.player.y + dragonblocks.player.height + 3 - dragonblocks.map.displayHeight);
123 else if(dragonblocks.map.displayTop > dragonblocks.player.y - 2)
124 dragonblocks.map.displayTop = parseInt(dragonblocks.player.y - 2);
125 dragonblocks.map.graphicsUpdate();
128 dragonblocks.keyHandler.down(" ", _ => { dragonblocks.player.jump() });
129 dragonblocks.keyHandler.up(" ", _ => { dragonblocks.player.stopJump() });
130 dragonblocks.keyHandler.down("ArrowLeft", _ => { dragonblocks.player.moveLeft() });
131 dragonblocks.keyHandler.down("ArrowRight", _ => { dragonblocks.player.moveRight() });
132 dragonblocks.keyHandler.up("ArrowLeft", _ => { dragonblocks.player.stop() });
133 dragonblocks.keyHandler.up("ArrowRight", _ => { dragonblocks.player.stop() });
134 dragonblocks.keyHandler.down("i", _ => { dragonblocks.player.toggleInventory(); });
135 dragonblocks.keyHandler.down("n", _ => { dragonblocks.player.nextItem() });
136 dragonblocks.keyHandler.down("b", _=>{ dragonblocks.player.previousItem() });
137 dragonblocks.keyHandler.down("scroll", _ => { dragonblocks.player.nextItem() });
138 dragonblocks.keyHandler.up("scroll", _=>{ dragonblocks.player.previousItem() });
139 for(let i = 1; i < 9; i++)
140 dragonblocks.keyHandler.down(i.toString(), _ => { dragonblocks.player.select(i - 1) });
141 let mapDisplay = document.getElementById("dragonblocks.map");
142 addEventListener("mouseup", event => {
144 dragonblocks.player.digStop();
146 addEventListener("keydown", event => {
147 if(event.key == "Escape" && dragonblocks.player.inventoryIsOpen())
148 dragonblocks.player.closeInventory();
150 // Map Interaction Controls
151 for(let x = 0; x < dragonblocks.map.displayWidth; x++){
152 for(let y = 0; y < dragonblocks.map.displayHeight; y++){
153 let nodeDisplay = document.getElementById("dragonblocks.map.node[" + x + "][" + y + "]");
154 nodeDisplay.addEventListener("mouseover", event => {
155 if(dragonblocks.player.canReach(x + dragonblocks.map.displayLeft, y + dragonblocks.map.displayTop))
156 event.srcElement.style.boxShadow = "0 0 0 1px black inset";
158 nodeDisplay.addEventListener("mouseleave", event => {
159 event.srcElement.style.boxShadow = "none";
161 nodeDisplay.addEventListener("mousedown", event => {
162 let [ix, iy] = [x + dragonblocks.map.displayLeft, y + dragonblocks.map.displayTop]
165 dragonblocks.player.digStart(ix, iy);
168 dragonblocks.player.build(ix, iy);
176 this.meta.skin = value;
177 this.texture = dragonblocks.skins[value].texture;
178 this.updateTexture();
181 return this.meta.skin;
184 switch(mode.toString().toLowerCase()){
187 this.meta.creative = false;
191 this.meta.creative = true;
196 this.resetInventoryElements();
197 this.tmp.defaultTool = dragonblocks.getTool(this.meta.creative ? "dragonblocks:creative_hand" : "dragonblocks:hand");
201 return this.meta.creative ? "creative" : "survival";
204 return dragonblocks.getTool(this.getWieldedItem().item) || this.tmp.defaultTool;
207 return this.tmp.inventory.opened;
210 this.tmp.inventory.open();
211 dragonblocks.keyHandler.lockAll();
212 dragonblocks.keyHandler.unlock("i");
213 dragonblocks.gui.showLayer();
216 this.tmp.inventory.close();
217 dragonblocks.keyHandler.unlockAll();
218 dragonblocks.gui.hideLayer();
221 this.inventoryIsOpen() ? this.closeInventory() : this.openInventory();
224 return this.tmp.mainInventory.add(itemstring);
227 this.tmp.mainInventory.clear();
229 setInventoryElements(elems){
230 this.tmp.inventory.elements = elems;
232 resetInventoryElements(){
233 let elems = [this.tmp.mainInventory];
234 elems.unshift(this.gamemode == "creative" ? this.tmp.creativeInventory : this.tmp.survivalInventory);
235 this.setInventoryElements(elems);
238 this.tmp.hudbar.previousItem();
241 this.tmp.hudbar.nextItem();
244 this.tmp.hudbar.select(i);
247 return this.tmp.hudbar.getSelectedItem();
249 set onNextInventoryClose(func){
250 this.tmp.inventory.onNextClose = func;
253 Object.assign(dragonblocks.Player.prototype, dragonblocks.MapIntercation); //Mixin