using System; using System.Linq; using System.Threading.Tasks; var activeTrader = ""; var traderId = -1; var allReceivedItems = new HashSet(); string GetItemName(int itemId, string itemType, int spriteId) { try { var type = itemType == "s" ? ItemType.Floor : ItemType.Wall; var furniInfo = FurniData.GetInfo(type, spriteId); return furniInfo.Name; } catch { return $"item_{spriteId}"; } } OnIntercept(In["TradingOpen"], async e => { var userId1 = e.Packet.ReadInt(); var canTrade1 = e.Packet.ReadInt(); var userId2 = e.Packet.ReadInt(); var canTrade2 = e.Packet.ReadInt(); traderId = (userId1 == Self.Id) ? userId2 : userId1; allReceivedItems.Clear(); var trader = Users.FirstOrDefault(u => u.Id == traderId); if (trader != null) { activeTrader = trader.Name; } }); OnIntercept(In["TradingItemList"], async e => { var packet = e.Packet; try { var user1Id = packet.ReadInt(); var user1ItemCount = packet.ReadInt(); var user1CreditCount = packet.ReadInt(); var user1Items = packet.ReadInt(); var user2Id = packet.ReadInt(); var user2ItemCount = packet.ReadInt(); if (user2Id == traderId && user2ItemCount > 0) { for (int j = 0; j < user2ItemCount; j++) { try { var itemId = packet.ReadInt(); var itemType = packet.ReadString(); var furniId = packet.ReadInt(); var spriteId = packet.ReadInt(); if (spriteId > 0 && spriteId < 100000) { var itemName = GetItemName(itemId, itemType, spriteId); allReceivedItems.Add(itemName); } if (j == 0) { break; } } catch { break; } } if (allReceivedItems.Count > 0) { await Task.Delay(1); Send(Out["AcceptTrading"]); } } } catch { } }); OnIntercept(In["TradingConfirmation"], async e => { await Task.Delay(1); Send(Out["ConfirmAcceptTrading"]); }); OnIntercept(In["TradingCompleted"], async e => { if (!string.IsNullOrEmpty(activeTrader) && allReceivedItems.Count > 0) { await Task.Delay(1); var itemList = string.Join(", ", allReceivedItems); Shout($"Hey {activeTrader} thank you for the {itemList}!"); } activeTrader = ""; traderId = -1; allReceivedItems.Clear(); }); Wait();