diff --git a/package.json b/package.json index 7861601..af024c5 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,8 @@ "prismarine-entity": "0.1.0", "prismarine-world": "0.3.3", "prismarine-world-sync": "0.1.0", + "prismarine-item": "0.0.0", + "prismarine-windows": "0.0.0", "random-seed": "^0.2.0", "request-promise": "^0.4.3", "requireindex": "~1.0.0", diff --git a/src/lib/plugins/entities.js b/src/lib/plugins/entities.js index 2384f28..3771561 100644 --- a/src/lib/plugins/entities.js +++ b/src/lib/plugins/entities.js @@ -1,6 +1,8 @@ -var Entity=require("../entity"); +var Entity = require("../entity"); +var Version = require("../version") var Vec3 = require("vec3").Vec3; -var entitiesByName=require("minecraft-data")(require("../version")).entitiesByName; +var ItemStack = require("prismarine-item")(Version) +var entitiesByName=require("minecraft-data")(Version).entitiesByName; var path = require('path'); var requireIndex = require('requireindex'); @@ -79,7 +81,6 @@ module.exports.server=function(serv,options) { }); if (players.length) { players[0].collect(entity); - entity.destroy(); } } if (!entity.velocity || !entity.size) return; @@ -257,13 +258,37 @@ module.exports.entity=function(entity,serv){ }; entity.collect = (collectEntity) => { - if (entity.type != 'player') serv.emit('error', 'Non-player entity (ttype ' + entity.type + ') cannot collect another entity'); - else { + if (entity.type != 'player'){ + serv.emit('error', 'Non-player entity (ttype ' + entity.type + ') cannot collect another entity') + return; + } + + // Add it to a stack already in the player's inventory if possible + for(var item in entity.inventory.items()){ + if(item.type == collectEntity.itemId){ + item.stackSize += 1 + collectEntity._writeOthersNearby('collect', { + collectedEntityId: collectEntity.id, + collectorEntityId: entity.id + }); + entity.playSoundAtSelf('random.pop'); + collectEntity.destroy() + return; + } + } + + // If we couldn't add it to a already existing stack, put it in a new stack if the inventory has room + var emptySlot = entity.inventory.firstEmptyInventorySlot() + if(emptySlot != null){ collectEntity._writeOthersNearby('collect', { collectedEntityId: collectEntity.id, collectorEntityId: entity.id }); entity.playSoundAtSelf('random.pop'); + + var newItem = new ItemStack(collectEntity.itemId, 1, collectEntity.damage) + entity.inventory.updateSlot(emptySlot, newItem) + collectEntity.destroy() } } diff --git a/src/lib/plugins/inventory.js b/src/lib/plugins/inventory.js index 15866e7..34ce546 100644 --- a/src/lib/plugins/inventory.js +++ b/src/lib/plugins/inventory.js @@ -1,26 +1,33 @@ +var Version = require("../version") +var Windows = require("prismarine-windows")(Version).windows +var ItemStack = require("prismarine-item")(Version) + module.exports.player=function(player) { - player.heldItemSlot=0; - player.heldItem=0; - player.inventory=new Array(44); + player.heldItemSlot = 0 + player.heldItem = new ItemStack(256, 1) + player.inventory = new Windows.InventoryWindow(0, "Inventory", 44) player._client.on("held_item_slot", ({slotId} = {}) => { player.heldItemSlot = slotId; - if(player.inventory[36+player.heldItemSlot]===undefined){ - player.inventory[36+player.heldItemSlot]={ - blockId:-1 - }; - } - player.heldItem = player.inventory[36+player.heldItemSlot]; + + player.heldItem = player.inventory.itemsRange(36 + player.heldItemSlot, 36 + player.heldItemSlot + 1) player._writeOthersNearby("entity_equipment",{ - entityId:player.id, - slot:0, - item:player.heldItem + entityId: player.id, + slot: 0, + item: ItemStack.toNotch(player.heldItem) }); }); player._client.on("set_creative_slot", ({slot,item} ={}) => { - player.inventory[slot]=item; + if(item.blockId == -1){ + player.inventory.updateSlot(slot, undefined) + return; + } + + var newItem = new ItemStack(item.blockId, item.itemCount, item.metadata) + player.inventory.updateSlot(slot, newItem) + if (slot==36) player._writeOthersNearby("entity_equipment",{ entityId:player.id, @@ -53,4 +60,17 @@ module.exports.player=function(player) }); }); + + player.inventory.on("windowUpdate", function(){ + var items = player.inventory.slots + + for(var itemIndex in items){ + var item = items[itemIndex] + player._client.write("set_slot", { + windowId: 0, + slot: itemIndex, + item: ItemStack.toNotch(item) + }) + } + }) };