From f159090a6224c19e7fe1cc58e214593090c35d16 Mon Sep 17 00:00:00 2001 From: Sadzurami Date: Tue, 12 Mar 2024 10:57:37 +0300 Subject: [PATCH 1/2] fix emitting events without backpack loaded --- handlers.js | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/handlers.js b/handlers.js index 1d57bbf..54d45d4 100644 --- a/handlers.js +++ b/handlers.js @@ -173,13 +173,12 @@ handlers[Language.SO_Create] = function(body) { return; // Not an item } - if (!this.backpack) { - return; // We don't have our backpack yet! - } - let item = decodeProto(Schema.CSOEconItem, proto.object_data); - item.position = item.inventory & 0x0000FFFF; - this.backpack.push(item); + + let isNew = (item.inventory >>> 30) & 1; + item.position = (isNew ? 0 : item.inventory & 0xFFFF); + + if (this.backpack) this.backpack.push(item); this.emit('itemAcquired', item); }; @@ -199,22 +198,24 @@ handlers[Language.SO_UpdateMultiple] = function(body) { TeamFortress2.prototype._handleSOUpdate = function(so) { switch (so.type_id) { case 1: - if (!this.backpack) { - return; // We don't have our backpack yet! - } + let newItem = decodeProto(Schema.CSOEconItem, so.object_data); + + let isNew = (newItem.inventory >>> 30) & 1; + newItem.position = (isNew ? 0 : newItem.inventory & 0xFFFF); - let item = decodeProto(Schema.CSOEconItem, so.object_data); - item.position = item.inventory & 0x0000FFFF; - for (let i = 0; i < this.backpack.length; i++) { - if (this.backpack[i].id == item.id) { - let oldItem = this.backpack[i]; - this.backpack[i] = item; + let oldItem = null; - this.emit('itemChanged', oldItem, item); + if (this.backpack) { + for (let i = 0; i < this.backpack.length; i++) { + if (this.backpack[i].id != newItem.id) continue; + + oldItem = this.backpack[i]; + this.backpack[i] = newItem; break; } } + this.emit('itemChanged', oldItem || newItem, newItem); break; case 7: let data = decodeProto(Schema.CSOEconGameAccountClient, so.object_data); @@ -255,21 +256,21 @@ handlers[Language.SO_Destroy] = function(body) { return; // Not an item } - if (!this.backpack) { - return; // We don't have our backpack yet - } - let item = decodeProto(Schema.CSOEconItem, proto.object_data); - let itemData = null; - for (let i = 0; i < this.backpack.length; i++) { - if (this.backpack[i].id == item.id) { - itemData = this.backpack[i]; + + let isNew = (item.inventory >>> 30) & 1; + item.position = (isNew ? 0 : item.inventory & 0xFFFF); + + if (this.backpack) { + for (let i = 0; i < this.backpack.length; i++) { + if (this.backpack[i].id != item.id) continue; + this.backpack.splice(i, 1); break; } } - this.emit('itemRemoved', itemData); + this.emit('itemRemoved', item); }; // Item manipulation @@ -376,4 +377,4 @@ function decodeProto(proto, encoded) { // Anything falsy is true return !val; } -} +} \ No newline at end of file From 30c9ac5db6bc1b7a2b71c714de914a3c168edc8c Mon Sep 17 00:00:00 2001 From: Sadzurami Date: Tue, 12 Mar 2024 10:57:45 +0300 Subject: [PATCH 2/2] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 05ea300..687223b 100644 --- a/README.md +++ b/README.md @@ -257,7 +257,7 @@ The `premium` property of node-tf2 would now be true and the `backpackSlots` pro Emitted when we receive a new item. `item` is the item that we just received, and `tf2.backpack` is updated before the event is emitted. ### itemChanged -- `oldItem` - The old item data +- `oldItem` - The old item data (may be same as `newItem` if backpack was not loaded yet) - `newItem` - The new item data Emitted when an item in our backpack changes (e.g. style update, position changed, etc.).