]> git.lizzy.rs Git - dragonblocks.git/blob - engine/player.js
Added dragonblock.player.setGamemode()
[dragonblocks.git] / engine / player.js
1 /*
2  * player.js
3  * 
4  * Copyright 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
5  * 
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.
10  * 
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.
15  * 
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,
19  * MA 02110-1301, USA.
20  * 
21  * 
22  */
23 dragonblocks.registerTool({
24         name: "dragonblocks:hand",
25         interval: 500,
26         groups: [
27                 {
28                         name: "default",
29                         damage: 2,
30                 },
31                 {
32                         name: "cracky",
33                         damage: 0,
34                 }
35         ]
36 });
37 dragonblocks.registerTool({
38         name: "dragonblocks:creative_hand",
39         range: Infinity,
40         groups: [
41                 {
42                         name: "default",
43                         damage: Infinity
44                 }
45         ]
46 });
47 dragonblocks.registerEntity({
48         name: "dragonblocks:player",
49         gravity: true,
50         width: 1,
51         height: 2,
52         horizontalSpeed: dragonblocks.settings.player.speed,
53         verticalSpeed: dragonblocks.settings.player.jumpspeed,
54         meta: {
55                 skin: dragonblocks.settings.player.defaultSkin,
56                 creative: false,
57         }
58 });
59 dragonblocks.Player = class extends dragonblocks.SpawnedEntity{
60         constructor(){
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" });
64                 }
65                 else
66                         super(dragonblocks.entities["dragonblocks:player"], dragonblocks.map.width / 2, 5);
67                 dragonblocks.player = this;
68                 let self = this;
69                 // Skin
70                 this.skin = this.meta.skin;
71                 // Inventory
72                 this.tmp.inventory = new dragonblocks.InventoryGroup();                 // Create Inventory Group that can hold multible Inventories
73                 // Main Inventory
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
78                                         stack.count = 1;
79                         });
80                 }
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
85                 });
86                 this.tmp.mainInventory.addUpdateListener(_ => {
87                         if(self.tmp.hudbar)
88                                 self.tmp.hudbar.update();
89                 });
90                 // Hudbar
91                 this.tmp.hudbar = new dragonblocks.Hudbar(this.tmp.mainInventory, 8);           // The hudbar has 8 slots
92                 // Creative Inventory
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
96                 // Survival Inventory
97                 this.tmp.survivalInventory = new dragonblocks.InventoryContainer({
98                         inventory: new dragonblocks.Craftfield(3, 3),
99                         top: 0.5,
100                         bottom: 0.5,
101                         left: 1,
102                         right: 2,
103                 });
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();
108                 });
109                 //Init Inventory
110                 this.resetInventoryElements();
111                 // Map Interaction
112                 this.tmp.tool = null;
113                 this.tmp.defaultTool = this.meta.creative ? dragonblocks.getTool("dragonblocks:creative_hand") : dragonblocks.getTool("dragonblocks:hand");
114                 this.initMapInteraction();
115                 // Map Scroll
116                 setInterval(_ => {
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();
126                 });
127                 // Controls
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 => {
143                         if(event.which == 1)
144                                 dragonblocks.player.digStop();
145                 });
146                 addEventListener("keydown", event => {
147                         if(event.key == "Escape" && dragonblocks.player.inventoryIsOpen())
148                                 dragonblocks.player.closeInventory();
149                 });
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";
157                                 });
158                                 nodeDisplay.addEventListener("mouseleave", event => {
159                                         event.srcElement.style.boxShadow = "none";
160                                 });
161                                 nodeDisplay.addEventListener("mousedown", event => {
162                                         let [ix, iy] = [x + dragonblocks.map.displayLeft, y + dragonblocks.map.displayTop]
163                                         switch(event.which){
164                                                 case 1:
165                                                         dragonblocks.player.digStart(ix, iy);
166                                                         break;
167                                                 case 3:
168                                                         dragonblocks.player.build(ix, iy);
169                                                         break;
170                                         }
171                                 });
172                         }
173                 }
174         }
175         set skin(value){
176                 this.meta.skin = value;
177                 this.texture = dragonblocks.skins[value].texture;
178                 this.updateTexture();
179         }
180         get skin(){
181                 return this.meta.skin;
182         }
183         set gamemode(mode){
184                 this.setGamemode(mode);
185         }
186         get gamemode(){
187                 return this.meta.creative ? "creative" : "survival";
188         }
189         get tool(){
190                 return dragonblocks.getTool(this.getWieldedItem().item) || this.tmp.defaultTool;
191         }
192         setGamemode(mode){
193                 switch(mode.toString().toLowerCase()){
194                         case "0":
195                         case "survival":
196                                 this.meta.creative = false;
197                                 break;
198                         case "1":
199                         case "creative":
200                                 this.meta.creative = true;
201                                 break;
202                         default:
203                                 return false;
204                 }
205                 this.resetInventoryElements();
206                 this.tmp.defaultTool = dragonblocks.getTool(this.meta.creative ? "dragonblocks:creative_hand" : "dragonblocks:hand");
207                 return true;
208         }
209         inventoryIsOpen(){
210                 return this.tmp.inventory.opened;
211         }
212         openInventory(){
213                 this.tmp.inventory.open();
214                 dragonblocks.keyHandler.lockAll();
215                 dragonblocks.keyHandler.unlock("i");
216                 dragonblocks.gui.showLayer();
217         }
218         closeInventory(){
219                 this.tmp.inventory.close();
220                 dragonblocks.keyHandler.unlockAll();
221                 dragonblocks.gui.hideLayer();
222         }
223         toggleInventory(){
224                 this.inventoryIsOpen() ? this.closeInventory() : this.openInventory();
225         }
226         give(itemstring){
227                 return this.tmp.mainInventory.add(itemstring);
228         }
229         clearInventory(){
230                 this.tmp.mainInventory.clear();
231         }
232         setInventoryElements(elems){
233                 this.tmp.inventory.elements = elems;
234         }
235         resetInventoryElements(){
236                 let elems = [this.tmp.mainInventory];
237                 elems.unshift(this.gamemode == "creative" ? this.tmp.creativeInventory : this.tmp.survivalInventory);
238                 this.setInventoryElements(elems);
239         }
240         previousItem(){
241                 this.tmp.hudbar.previousItem();
242         }
243         nextItem(){
244                 this.tmp.hudbar.nextItem();
245         }
246         select(i){
247                 this.tmp.hudbar.select(i);
248         }
249         getWieldedItem(){
250                 return this.tmp.hudbar.getSelectedItem();
251         }
252         set onNextInventoryClose(func){
253                 this.tmp.inventory.onNextClose = func;
254         }
255 }
256 Object.assign(dragonblocks.Player.prototype, dragonblocks.MapIntercation);      //Mixin