Exemplo n.º 1
0
        private void OnUpdateItem(TSPlayer player, BinaryReader reader)
        {
            var itemIndex = reader.ReadInt16();

            reader.ReadVector2();
            reader.ReadVector2();
            var stackSize = reader.ReadInt16();
            var prefixId  = reader.ReadByte();

            reader.ReadByte();
            var itemId = reader.ReadInt16();

            if (itemIndex == Main.maxItems)
            {
                // Ignore hay created by the sickle, up to a certain stack size.
                if (player.SelectedItem.type == ItemID.Sickle && itemId == ItemID.Hay && stackSize <= 4)
                {
                    return;
                }

                var balanceSheet = player.GetOrCreateBalanceSheet();
                balanceSheet.AddTransaction(Transaction.WorldSlot, itemId, -stackSize, prefixId);
            }
            else
            {
                var item         = Main.item[itemIndex];
                var balanceSheet = player.GetOrCreateBalanceSheet();
                var netItem      = new NetItem(item.type, item.stack - stackSize, item.prefix);
                var lastNetItem  = player.GetLastUpdatedItem();
                // We need to specially detect if the client is stacking items, and adjust appropriately.
                if (netItem.NetId == lastNetItem.NetId && netItem.Stack == -lastNetItem.Stack && netItem.Stack > 0 &&
                    netItem.PrefixId == lastNetItem.PrefixId)
                {
                    Debug.WriteLine($"DEBUG: Stack update at {itemIndex}");
                    balanceSheet.AddTransaction(Transaction.StackUpdateSlot, item.type, item.stack - stackSize,
                                                item.prefix);
                }
                else
                {
                    balanceSheet.AddTransaction(Transaction.WorldSlot, item.type, item.stack - stackSize, item.prefix);
                }
                player.SetLastUpdatedItem(netItem);
            }
        }