@bdsx/invsee
Version:
See the Inventory of the players
284 lines • 19.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FakeDoubleContainer = void 0;
const inventory_1 = require("bdsx/bds/inventory");
const packets_1 = require("bdsx/bds/packets");
const blockpos_1 = require("bdsx/bds/blockpos");
const launcher_1 = require("bdsx/launcher");
const PlayerManager_1 = require("../PlayerManager");
const Utils_1 = require("../utils/Utils");
const nbt_1 = require("bdsx/bds/nbt");
class FakeDoubleContainer {
constructor(block, containerType, containerSize, player, inventory) {
this.netId = player.getNetworkIdentifier();
this.containerId = player.nextContainerCounter();
this.block = block;
this.containerType = containerType;
this.containerSize = containerSize;
this.inventory = inventory || {};
}
placeContainer(pos) {
const pk = packets_1.UpdateBlockPacket.allocate();
pk.blockPos.construct(pos);
pk.dataLayerId = 0;
pk.flags = packets_1.UpdateBlockPacket.Flags.Network;
pk.blockRuntimeId = this.block.getRuntimeId();
pk.sendTo(this.netId);
pk.dispose();
}
/**
* Places the containers client-side.
* This is required in Bedrock edition.
*/
placeContainers() {
this.placeContainer(this.position);
this.placeContainer(this.position2);
}
/**
* Opens the container client-side.
*/
openContainer() {
const pk = packets_1.ContainerOpenPacket.allocate();
pk.containerId = this.containerId;
pk.type = this.containerType;
pk.pos.construct(this.position);
pk.sendTo(this.netId);
pk.dispose();
}
/**
* Force-closes the container client-side.
*
* @remarks This will destruct the container
*/
closeContainer() {
const pk = packets_1.ContainerClosePacket.allocate();
pk.containerId = this.containerId;
pk.server = true;
pk.sendTo(this.netId);
pk.dispose();
}
/**
* Sends the fake container to the client.
*/
sendToPlayer() {
PlayerManager_1.PlayerManager.setContainer(this.netId, this);
this.position = Utils_1.Utils.getAbovePosition(this.netId);
this.position2 = blockpos_1.BlockPos.create(this.position.x + 1, this.position.y, this.position.z);
this.placeContainers();
this.sendNbtData(1);
this.sendNbtData(0);
launcher_1.bedrockServer.serverInstance.nextTick().then(() => {
this.openContainer();
this.updateAllItems();
});
}
/**
* Sets an item in the container.
*
* @param slot - The slot to set the item in.
* @param item - The item to set.
*
* @remarks This will update the item client-side if needed to.
*/
setItem(slot, item) {
var _a;
if (slot < 0 || slot >= this.containerSize) {
throw new Error(`Slot ${slot} is out of range (container has ${this.containerSize} slots)`);
}
if (this.inventory[slot] !== undefined && !((_a = this.inventory[slot]) === null || _a === void 0 ? void 0 : _a.sameItem(item)))
this.inventory[slot].destruct();
this.inventory[slot] = item;
// If the container is not sent yet, no need to update the slot.
if (PlayerManager_1.PlayerManager.hasContainer(this.netId)) {
this.updateItem(slot, item);
}
}
/**
* Sets the container's inventory contents.
*
* @param contents - The contents to set.
*/
setContents(contents) {
for (const [slot, item] of Object.entries(contents)) {
this.setItem(+slot, item);
}
}
/**
* Adds an item to the container
*
* @param item - The item to add.
*/
addItem(item) {
for (let i = 0; i < this.containerSize; i++) {
if (!this.inventory[i]) {
this.setItem(i, item);
return;
}
}
}
/**
* Updates a single item in the container's inventory client-side.
*/
updateItem(slot, item) {
if (slot < 0 || slot >= this.containerSize) {
throw new Error(`Slot ${slot} is out of range (container has ${this.containerSize} slots)`);
}
const pk = packets_1.InventorySlotPacket.allocate();
pk.containerId = this.containerId;
pk.slot = slot;
const descriptor = inventory_1.NetworkItemStackDescriptor.constructWith(item);
pk.descriptor.construct(descriptor);
pk.sendTo(this.netId);
descriptor.destruct();
pk.dispose();
}
/**
* Updates the container's inventory client-side.
*/
updateAllItems() {
for (let [slot, item] of Object.entries(this.inventory)) {
this.updateItem(+slot, item);
}
}
/**
* Returns the item at the specified slot.
*
* @param slot - The slot to get the item from.
*/
getItem(slot) {
if (slot < 0 || slot >= this.containerSize) {
throw new Error(`Slot ${slot} is out of range (container has ${this.containerSize} slots)`);
}
return this.inventory[slot];
}
/**
* Returns the contents of the container.
*/
getContents() {
return this.inventory;
}
/**
* Clears a container's slot,
* updating it client-side if needed.
*/
clearItem(slot) {
if (slot < 0 || slot >= this.containerSize) {
throw new Error(`Slot ${slot} is out of range (container has ${this.containerSize} slots)`);
}
if (this.inventory[slot]) {
this.inventory[slot].destruct();
delete this.inventory[slot];
// If the container is not sent yet, no need to update the slot.
if (PlayerManager_1.PlayerManager.hasContainer(this.netId)) {
this.updateItem(slot, inventory_1.ItemStack.EMPTY_ITEM);
}
}
}
/**
* Clears the container's contents,
* updating it client-side if needed.
*/
clearContents() {
for (const [slot, item] of Object.entries(this.inventory)) {
this.clearItem(+slot);
}
}
/**
* Sets a custom name to the container.
*
* @param name - The name to set.
*
* @remarks This needs to be set BEFORE sending the container.
*/
setCustomName(name) {
this.customName = name;
}
/**
* Sends the container's nbt data to the client.
*/
sendNbtData(pairLead = 0) {
const pk = packets_1.BlockActorDataPacket.allocate();
pk.pos.set(pairLead ? this.position : this.position2);
let nbtData = {};
if (this.customName)
nbtData["CustomName"] = nbt_1.StringTag.constructWith(this.customName);
nbtData["pairlead"] = nbt_1.ByteTag.constructWith(pairLead);
nbtData["pairx"] = nbt_1.IntTag.constructWith(pairLead ? this.position2.x : this.position.x);
nbtData["pairz"] = nbt_1.IntTag.constructWith(pairLead ? this.position2.z : this.position.z);
for (const [key, tag] of Object.entries(nbtData))
pk.data.set(key, tag);
pk.sendTo(this.netId);
pk.dispose();
for (const tag of Object.values(nbtData))
tag.destruct();
}
/**
* Callback is triggered when the player interacts with an item,
* in the container, or in it's inventory.
*/
onTransaction(callback) {
this.transactionCallback = callback;
}
/**
* Returns whether a transaction callback is set.
*/
hasTransactionCallback() {
return this.transactionCallback !== undefined;
}
/**
* Calls the transaction callback.
*/
callTransactionCallback(action) {
if (this.hasTransactionCallback())
return this.transactionCallback(action);
}
/**
* Callback is triggered when the player closes the container, or is forced to do so.
*/
onContainerClose(callback) {
this.containerCloseCallback = callback;
}
/**
* Returns whether a container close callback is set.
*/
hasContainerCloseCallback() {
return this.containerCloseCallback !== undefined;
}
/**
* Calls the container close callback.
*/
callContainerCloseCallback() {
if (this.hasContainerCloseCallback())
this.containerCloseCallback();
this.destruct();
}
destroyContainer(pos) {
const pk = packets_1.UpdateBlockPacket.allocate();
pk.blockPos.construct(pos);
pk.dataLayerId = 0;
pk.flags = packets_1.UpdateBlockPacket.Flags.Network;
pk.blockRuntimeId = Utils_1.Utils.getBlockAtPosition(this.netId, pos).getRuntimeId();
pk.sendTo(this.netId);
pk.dispose();
}
/**
* Destroys the containers client-side,
* and replaces them with the original blocks.
*/
destroyContainers() {
this.destroyContainer(this.position);
this.destroyContainer(this.position2);
}
/**
* Destroys the containers, and destructs all the ItemStack instances.
*/
destruct() {
this.destroyContainers();
for (const item of Object.values(this.inventory)) {
item.destruct();
}
PlayerManager_1.PlayerManager.removeContainer(this.netId);
}
}
exports.FakeDoubleContainer = FakeDoubleContainer;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmFrZURvdWJsZUNvbnRhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkZha2VEb3VibGVDb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esa0RBQTBGO0FBRTFGLDhDQU8wQjtBQUMxQixnREFBNkM7QUFDN0MsNENBQThDO0FBRTlDLG9EQUFpRDtBQUNqRCwwQ0FBdUM7QUFFdkMsc0NBQStEO0FBTS9ELE1BQWEsbUJBQW1CO0lBYzVCLFlBQVksS0FBWSxFQUFFLGFBQTRCLEVBQUUsYUFBcUIsRUFBRSxNQUFvQixFQUFFLFNBQThCO1FBQy9ILElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUdPLGNBQWMsQ0FBQyxHQUFhO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLDJCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxLQUFLLEdBQUcsMkJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUMzQyxFQUFFLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDOUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsRUFBRSxD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