private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
        {
            if (msg == WinApi.WM_COPYDATA)
            {
                var cds = (WinApi.COPYDATASTRUCT)Marshal.PtrToStructure(lparam, typeof(WinApi.COPYDATASTRUCT));

                if (cds.cbData < 12)
                    return IntPtr.Zero;

                var recv = (int)cds.dwData == Sig.Recv;

                if (!recv)
                    return IntPtr.Zero;

                var data = new byte[cds.cbData];
                Marshal.Copy(cds.lpData, data, 0, cds.cbData);

                var packet = new Packet(data, 0);

                HandlePacket(packet);
            }

            return (IntPtr)1;
        }
        private void ProductsRequest(Packet packet)
        {
            if (packet.GetString() != "GetProductList" || !packet.GetBool()) // Is valid
                return;

            var currentPostId = packet.GetInt();
            var post = Erinn.Posts.FirstOrDefault(p => p.Id == currentPostId);

            if (post == null)
                return;

            packet.GetInt(); // Unk
            packet.GetInt(); // Unk

            var itemCount = packet.GetInt();
            for (var i = 0; i < itemCount; i++) // List of item ids (duplicated later in the packet)
                packet.GetInt();

            itemCount = packet.GetInt();
            for (var i = 0; i < itemCount; i++)
            {
                var itemId = packet.GetInt();

                var item = post.Items.FirstOrDefault(a => a.Id == itemId);

                var normalizedCost = packet.GetInt();
                var stock = packet.GetInt();
                packet.GetBool(); // Limited time

                if (item != null)
                {
                    item.Stock = stock;
                    item.Price = (int)Math.Round(normalizedCost * post.MerchantLevel.Discount, MidpointRounding.AwayFromZero);
                }

                var townCount = packet.GetInt();
                for (var j = 0; j < townCount; j++)
                {
                    var destId = packet.GetInt();
                    packet.GetInt(); // Stock at destination
                    var normalizedSellPrice = packet.GetInt();

                    var destPost = Erinn.Posts.FirstOrDefault(p => p.Id == destId);

                    if (destPost == null || item == null)
                        continue;

                    if (!post.Weights.ContainsKey(destPost.Id))
                        continue;

                    var weight = post.Weights[destPost.Id];

                    var profit = item.Profits.FirstOrDefault(p => p.Destination == destPost);

                    if (profit != null)
                    {
                        var sellPrice = (int)Math.Round(normalizedSellPrice * weight * item.MultiFactor + item.AddFactor,
                            MidpointRounding.AwayFromZero);

                        profit.Amount = sellPrice - item.Price;
                    }
                }
            }

            PostSelect.SelectedItem = post;
            //CalculateTrades();
        }
 private void HandlePacket(Packet packet)
 {
     if (packet.Op == Properties.Settings.Default.CommerceInfoRequestOp)
         InfoRequest(packet);
     else if (packet.Op == Properties.Settings.Default.CommerceInfoUpdateOp)
         InfoUpdate(packet);
     else if (packet.Op == Properties.Settings.Default.ProductListRequestOp)
         ProductsRequest(packet);
 }
        private void InfoUpdate(Packet packet)
        {
            Erinn.Ducats = packet.GetLong();
            var transportFlags = packet.GetLong(); // Transport type flags (Bitfield)
            packet.GetInt(); // Unknown

            var townCount = packet.GetShort();

            for (var i = 0; i < townCount; i++)
            {
                var townId = packet.GetInt();
                var tradingExp = packet.GetInt();

                var town = Erinn.Posts.FirstOrDefault(t => t.Id == townId);

                if (town != null)
                    town.MerchantLevel = GetMerchantLevel(tradingExp);
            }

            if (Properties.Settings.Default.SniffTransports)
            {
                foreach (var transport in Erinn.Transports)
                {
                    transport.Enabled = (transportFlags & 1 << transport.Id) != 0;
                }
            }
        }
Example #5
0
 /// <summary>Writes packet as bin and the length of it as int to buffer.</summary>
 public Packet PutBin(Packet packet)
 {
     var val = packet.Build();
     return PutInt(val.Length).PutBin(val);
 }