-
Notifications
You must be signed in to change notification settings - Fork 1
/
chest.js
130 lines (107 loc) · 4.28 KB
/
chest.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
'use strict';
const InventoryDialog = require('voxel-inventory-dialog').InventoryDialog;
const Inventory = require('inventory');
const InventoryWindow = require('inventory-window');
const ItemPile = require('itempile');
module.exports = (game, opts) => new Chest(game, opts);
module.exports.pluginInfo = {
loadAfter: ['voxel-blockdata', 'voxel-registry', 'voxel-recipes', 'voxel-carry']
};
class Chest {
constructor(game, opts) {
this.game = game;
if (!game.plugins.get('voxel-carry')) throw new Error('voxel-chest requires "voxel-carry" plugin');
this.playerInventory = game.plugins.get('voxel-carry').inventory;
this.registry = game.plugins.get('voxel-registry') ? game.plugins.get('voxel-registry') : undefined;
this.recipes = game.plugins.get('voxel-recipes') ? game.plugins.get('voxel-recipes') : undefined;
this.blockdata = game.plugins.get('voxel-blockdata') ? game.plugins.get('voxel-blockdata') : undefined;
if (!('registerBlock' in opts)) opts.registerBlock = this.registry !== undefined;
if (!('registerRecipe' in opts)) opts.registerRecipe = this.recipes !== undefined;
this.chestDialog = new ChestDialog(game, this.playerInventory, this.registry, this.blockdata);
this.opts = opts;
this.enable();
}
enable() {
if (this.opts.registerBlock) {
// TODO: chest textures? not in current tp..
this.registry.registerBlock('chest', {texture: ['door_wood_lower', 'piston_top_normal', 'bookshelf'], onInteract: (target) => {
// TODO: server-side?
this.chestDialog.open(target);
return true;
}});
}
if (this.opts.registerRecipe) {
this.recipes.registerPositional([
['wood.plank', 'wood.plank', 'wood.plank'],
['wood.plank', undefined, 'wood.plank'],
['wood.plank', 'wood.plank', 'wood.plank']],
new ItemPile('chest', 1));
}
}
disable() {
}
}
class ChestDialog extends InventoryDialog {
constructor(game, playerInventory, registry, blockdata) {
const chestInventory = new Inventory(10, 3)
chestInventory.on('changed', () => this.updateBlockdata());
const chestIW = new InventoryWindow({inventory:chestInventory, registry:registry});
// allow shift-click to transfer items between these two inventories
chestIW.linkedInventory = playerInventory;
//this.playerIW.linkedInventory = this.chestInventory # TODO: need to reach into voxel-inventory-dialog?
const chestCont = chestIW.createContainer();
super(game,
{
playerLinkedInventory: chestInventory,
upper: [chestCont]
});
this.game = game;
this.playerInventory = playerInventory;
this.registry = registry;
this.blockdata = blockdata;
this.chestInventory = chestInventory;
}
loadBlockdata(x, y, z) {
if (!this.blockdata) {
console.log('voxel-blockdata not loaded, voxel-chest persistence disabled');
return;
}
let bd = this.blockdata.get(x, y, z);
console.log('activeBlockdata=',JSON.stringify(bd));
if (bd) {
console.log('load existing at ',x,y,z);
// TODO: better way to 'load' into an inventory than setting all slots?
const newInventory = Inventory.fromString(bd.inventory)
console.log('newInventory='+JSON.stringify(newInventory));
for (let i = 0; i < newInventory.array.length; ++i) { // TODO: if smaller than current?
let itemPile = newInventory.array[i];
console.log('load chest',i,itemPile);
this.chestInventory.set(i, itemPile);
}
} else {
console.log('new empty inventory at ',x,y,z);
bd = {inventory: this.chestInventory.toString()};
this.blockdata.set(x, y, z, bd);
}
this.activeBlockdata = bd;
console.log('activeBlockdata 2=',JSON.stringify(this.activeBlockdata));
}
open(target) {
this.chestInventory.clear();
const x = target.voxel[0];
const y = target.voxel[1];
const z = target.voxel[2];
this.loadBlockdata(x, y, z);
super.open(target);
}
updateBlockdata() {
console.log('update with activeBlockdata=',JSON.stringify(this.activeBlockdata));
if (!this.activeBlockdata) return;
console.log('chestInventory=',this.chestInventory.toString());
this.activeBlockdata.inventory = this.chestInventory.toString();
}
close() {
delete this.activeBlockdata;
super.close();
}
}