public override void Handle(NecClient client, NecPacket packet)
        {
            int  PartyLeaderInstanceId = packet.Data.ReadInt32();
            uint targetPartyInstanceId = packet.Data.ReadUInt32();

            Logger.Debug($"{client.Character.Name}Applied to party {targetPartyInstanceId}");

            Party     myParty             = Server.Instances.GetInstance(targetPartyInstanceId) as Party;
            NecClient myPartyLeaderClient = Server.Clients.GetByCharacterInstanceId(myParty.PartyLeaderId);


            IBuffer res = BufferProvider.Provide();

            res.WriteUInt32(myParty.PartyLeaderId);
            Router.Send(client.Map, (ushort)AreaPacketId.recv_party_apply_r, res, ServerType.Area);

            IBuffer res2 = BufferProvider.Provide();

            res2.WriteUInt32(client.Character.partyId); //Party ID?
            res2.WriteUInt32(client.Character.InstanceId);
            res2.WriteFixedString($"{client.Soul.Name}", 0x31);
            res2.WriteFixedString($"{client.Character.Name}", 0x5B);
            res2.WriteUInt32(client.Character.ClassId);
            res2.WriteByte(client.Character.Level);
            res2.WriteByte(2); //Criminal Status
            res2.WriteByte(1); //Beginner Protection (bool)
            res2.WriteByte(1); //Membership Status
            res2.WriteByte(1);
            Router.Send(myPartyLeaderClient, (ushort)MsgPacketId.recv_party_notify_apply, res2, ServerType.Msg);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            byte   presetNum = packet.data.ReadByte();
            string keyword   = packet.data.ReadFixedString(0x49); //Fixed string of 0x49 or 0x49 bytes.
            byte   option1   = packet.data.ReadByte();
            byte   option2   = packet.data.ReadByte();
            byte   option3   = packet.data.ReadByte();
            byte   option4   = packet.data.ReadByte();
            int    unknown   = packet.data.ReadInt32();
            short  stat1     = packet.data.ReadInt16();            //Stat of some sorts?
            short  stat2     = packet.data.ReadInt16();            //Stat of some sorts?
            long   gold      = packet.data.ReadInt64();            //Gold??
            byte   option5   = packet.data.ReadByte();
            byte   checkBox  = packet.data.ReadByte();             //Bool

            byte option6 = packet.data.ReadByte();                 //These are 3 separate bytes or a fixed string of 3 characters.
            byte option7 = packet.data.ReadByte();                 //
            byte option8 = packet.data.ReadByte();                 //

            long   gold2      = packet.data.ReadInt64();           //Gold??
            long   gold3      = packet.data.ReadInt64();           //Gold??
            string presetName = packet.data.ReadFixedString(0xC1); //Fixed string of 0xC1 or 0xC1 bytes.
            byte   option9    = packet.data.ReadByte();
            byte   option10   = packet.data.ReadByte();

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            router.Send(client, (ushort)AreaPacketId.recv_auction_regist_search_equipment_cond_r, res, ServerType.Area);
        }
Exemple #3
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();


            Router.Send(client, (ushort)MsgPacketId.recv_base_login_r, res, ServerType.Msg);
        }
Exemple #4
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteByte(0);
            Router.Send(client, (ushort)AreaPacketId.recv_event_end, res, ServerType.Area);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            /*int32, unknown
             * int32, target client(character) id[i think this is the sends structure]*/
            int       unknown          = packet.Data.ReadInt32();
            uint      targetInstanceId = packet.Data.ReadUInt32();
            NecClient targetClient     = Server.Clients.GetByCharacterInstanceId(targetInstanceId);

            targetClient.Character.partyRequest = client.Character.InstanceId;

            if (targetInstanceId == 0)
            {
                targetInstanceId = client.Character.InstanceId;
            } //band-aid for null reference errors while testing. to-do Delete this line.

            Logger.Debug(
                $"ID {client.Character.InstanceId} {client.Character.Name} sent a party invite to {targetClient.Character.Name} with instance ID {targetInstanceId}");

            IBuffer res = BufferProvider.Provide();

            res.WriteUInt32(targetInstanceId);
            Router.Send(client, (ushort)AreaPacketId.recv_party_invite_r, res, ServerType.Area);

            SendPartyNotifyInvite(client, targetInstanceId);
        }
Exemple #6
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            uint   newsUpdatedByInstanceId = packet.data.ReadUInt32();
            string unionNews = packet.data.ReadCString(); //Max size 0x196?

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0); //error check.  0 for success.  See sys_msg.csv for all error check messages.

            /*
             *      0	Union news changed
             *  GENERIC	Failed to change the union news
             *  -1709	You do not have permission to change the news
             *  -1715	The news contained banned words
             */

            router.Send(client, (ushort)MsgPacketId.recv_union_request_set_info_r, res, ServerType.Msg);

            //ToDo
            //L"network::proto_msg_implement_client::recv_union_notify_info()\n"
            //Permissions check for news updating based on 'newsUpdatedByInstanceId'. Returns 0 or 1709
            //Naughty word scrubbing for 'banned words' returns 1715


            IBuffer res2 = BufferProvider.Provide();

            res2.WriteInt32(0);                //Error check probably.  0 means success?
            res2.WriteCString($"{unionNews}"); //max size 0x196

            router.Send(client.union.unionMembers, (ushort)MsgPacketId.recv_union_notify_info, res2,
                        ServerType.Msg);
        }
Exemple #7
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            Router.Send(client, (ushort)MsgPacketId.recv_system_register_error_report_r, res, ServerType.Msg);
        }
Exemple #8
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(1);

            int numEntries = 2;

            res.WriteInt32(numEntries);//less than 0x1E

            for (int j = 0; j < numEntries; j++)
            {
                res.WriteFixedString("idk", 385);
                res.WriteInt64(1);
                res.WriteByte(1);
                res.WriteFixedString("idk_also", 385);

                for (int i = 0; i < 5; i++)
                {
                    res.WriteByte(1);
                    res.WriteInt32(1);
                    res.WriteInt32(1);
                    res.WriteInt32(1);

                    res.WriteInt32(1);

                    res.WriteInt32(1);
                }
            }
            res.WriteByte(1);
            res.WriteInt32(1);
            res.WriteFloat(1);

            Router.Send(client, (ushort)AreaPacketId.recv_quest_get_mission_quest_works_r, res);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();


            //  there is no recv
        }
Exemple #10
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            Party myParty = Server.Instances.GetInstance(client.Character.partyId) as Party;

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            Router.Send(client, (ushort)AreaPacketId.recv_party_disband_r, res, ServerType.Area);;
            Router.Send(myParty.PartyMembers, (ushort)AreaPacketId.recv_party_disband_r, res, ServerType.Area);


            IBuffer res2 = BufferProvider.Provide();

            Router.Send(myParty.PartyMembers, (ushort)MsgPacketId.recv_party_notify_disband, res2, ServerType.Msg);

            foreach (NecClient partyClient in myParty.PartyMembers)
            {
                IBuffer res3 = BufferProvider.Provide();
                res3.WriteUInt32(partyClient.Character.InstanceId);
                Router.Send(partyClient.Map, (ushort)AreaPacketId.recv_charabody_notify_party_leave, res3, ServerType.Area);
                Router.Send(partyClient, (ushort)AreaPacketId.recv_party_leave_r, res3, ServerType.Area);
            }

            myParty.PartyMembers.Clear();
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            Router.Send(client, (ushort)AreaPacketId.recv_charabody_access_start_r, res, ServerType.Area);
        }
Exemple #12
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            uint applicantInstanceId =
                packet.Data.ReadUInt32(); //Could be a Party ID value hidden as character-who-made-it's value

            Logger.Debug(
                $"character {client.Character.Name} accepted Application to party from character Instance ID {applicantInstanceId}");

            IBuffer res = BufferProvider.Provide();

            res.WriteUInt32(applicantInstanceId);
            Router.Send(client, (ushort)AreaPacketId.recv_party_accept_to_apply_r, res, ServerType.Area);

            Party     myParty         = Server.Instances.GetInstance(client.Character.partyId) as Party;
            NecClient applicantClient = Server.Clients.GetByCharacterInstanceId(applicantInstanceId);

            myParty.Join(applicantClient);


            IBuffer res2 = BufferProvider.Provide();

            Router.Send(applicantClient, (ushort)MsgPacketId.recv_party_notify_accept_to_apply, res2, ServerType.Msg);

            foreach (NecClient partyClient in myParty.PartyMembers)
            {
                //if (partyClient != client)
                {
                    SendPartyNotifyAddMember(partyClient, myParty);
                }
            }

            SendCharaBodyNotifyPartyJoin(applicantClient, myParty.InstanceId);
        }
Exemple #13
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType fromZone = (ItemZoneType)packet.data.ReadByte();
            byte         fromBag  = packet.data.ReadByte();
            short        fromSlot = packet.data.ReadInt16();
            ItemZoneType toZone   = (ItemZoneType)packet.data.ReadByte();
            byte         toBag    = packet.data.ReadByte();
            short        toSlot   = packet.data.ReadInt16();
            byte         quantity = packet.data.ReadByte();

            _Logger.Debug($"fromStoreType byte [{fromZone}] toStoreType byte [{toZone}]");
            _Logger.Debug($"fromBagId byte [{fromBag}] toBagId byte [{toBag}]");
            _Logger.Debug($"fromSlot byte [{fromSlot}] toSlot[{toSlot}]");
            _Logger.Debug($"itemCount [{quantity}]");

            ItemLocation fromLoc     = new ItemLocation(fromZone, fromBag, fromSlot);
            ItemLocation toLoc       = new ItemLocation(toZone, toBag, toSlot);
            ItemService  itemService = new ItemService(client.character);
            int          error       = 0;

            try
            {
                MoveResult            moveResult = itemService.Move(fromLoc, toLoc, quantity);
                List <PacketResponse> responses  = itemService.GetMoveResponses(client, moveResult);
                router.Send(client, responses);
            }
            catch (ItemException e)
            {
                error = (int)e.type;
            }

            RecvStorageDrawItem2 recvStorageDrawItem2 = new RecvStorageDrawItem2(client, error);

            router.Send(recvStorageDrawItem2);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            int channelId = packet.Data.ReadInt32();

            if (channelId == -1)
            {
                Logger.Debug(
                    "Escape button was selected to close channel select. channelId code  == -0xFFFF => SendEventEnd");
                SendEventEnd(client);
                return;
            }

            if (!Server.Maps.TryGet(client.Character.MapId, out Map map))
            {
                Logger.Error($"MapId: {client.Character.MapId} does not exist");
                return;
            }

            client.Character.Channel = channelId;
            map.EnterForce(client);
            SendEventEnd(client);

            IBuffer res2 = BufferProvider.Provide();

            res2.WriteUInt32(client.Character.InstanceId);
            res2.WriteCString("IsThisMyChannel?????"); //Length to be Found
            Router.Send(Server.Clients.GetAll(), (ushort)AreaPacketId.recv_channel_notify, res2, ServerType.Area);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType zone = (ItemZoneType)packet.data.ReadByte();
            byte         bag  = packet.data.ReadByte();
            short        slot = packet.data.ReadInt16();
            //9 bytes left TODO investigate, probably one is identify price which is irrelevant, check price server side

            ItemLocation location    = new ItemLocation(zone, bag, slot);
            ItemService  itemService = new ItemService(client.character);
            ItemInstance identifiedItem;
            int          error = 0;

            try
            {
                identifiedItem = itemService.GetIdentifiedItem(location);
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, identifiedItem);
                router.Send(recvItemInstance);

                identifiedItem.currentDurability = identifiedItem.maximumDurability;
                RecvItemUpdateDurability recvItemUpdateDurability = new RecvItemUpdateDurability(client, identifiedItem);
                router.Send(recvItemUpdateDurability);
            }
            catch (ItemException e)
            {
                error = (int)e.type;
            }

            RecvShopIdentify recvShopIdentify = new RecvShopIdentify(client, error);

            router.Send(recvShopIdentify);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            uint    kickTargetInstanceId = packet.data.ReadUInt32();
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0); //Kick Reason?  error check?  probably error check
            router.Send(client, (ushort)AreaPacketId.recv_party_kick_r, res, ServerType.Area);


            NecClient targetClient = server.clients.GetByCharacterInstanceId(kickTargetInstanceId);

            router.Send(targetClient, (ushort)MsgPacketId.recv_party_notify_kick, BufferProvider.Provide(), ServerType.Msg);

            IBuffer res2 = BufferProvider.Provide();

            res2.WriteUInt32(targetClient.character.instanceId);
            router.Send(targetClient.map, (ushort)AreaPacketId.recv_charabody_notify_party_leave, res2, ServerType.Area);


            Party myParty = server.instances.GetInstance(client.character.partyId) as Party;

            IBuffer res3 = BufferProvider.Provide();

            res3.WriteInt32(1);                                  //Remove Reason
            res3.WriteUInt32(targetClient.character.instanceId); //Instance ID
            router.Send(myParty.partyMembers, (ushort)MsgPacketId.recv_party_notify_remove_member, res3, ServerType.Msg);

            /*
             * PARTY_REMOVE	0	%s has left the party
             * PARTY_REMOVE	1	You have kicked %s from the party
             * PARTY_REMOVE	2	%s has been buried
             */

            myParty.partyMembers.Remove(targetClient);
        }
Exemple #17
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            int data = packet.data.ReadInt32();

            _Logger.Error(client,
                          $"{client.soul.name} {client.character.name} has sent a disconnect packet to the server.  Wave GoodBye! ");

            IBuffer buffer = BufferProvider.Provide();

            buffer.WriteInt32(data);

            NecPacket response = new NecPacket(
                (ushort)CustomPacketId.RecvDisconnect,
                buffer,
                packet.serverType,
                PacketType.Disconnect
                );

            router.Send(client, response);

            Task.Delay(TimeSpan.FromSeconds(60)).ContinueWith
                (t1 =>
            {
                if (client == null)
                {
                    return;
                }
                clients.Remove(client);
            }
                );
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType zone     = (ItemZoneType)packet.data.ReadByte();
            byte         bag      = packet.data.ReadByte();
            short        slot     = packet.data.ReadInt16();
            ulong        saleGold = packet.data.ReadUInt64(); //irrelevant, check sale price server side
            byte         quantity = packet.data.ReadByte();

            //TODO

            ItemService  itemService  = new ItemService(client.character);
            ItemInstance itemInstance = itemService.GetIdentifiedItem(new ItemLocation(zone, bag, slot));

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            router.Send(client, (ushort)AreaPacketId.recv_shop_sell_check_r, res, ServerType.Area);


            res = BufferProvider.Provide();
            res.WriteUInt64(itemInstance.instanceId);          // id?
            res.WriteInt64(Util.GetRandomNumber(1000, 25000)); // price?
            res.WriteInt64(Util.GetRandomNumber(100, 2500));   // identify?
            res.WriteInt64(Util.GetRandomNumber(100, 2500));   // curse?
            res.WriteInt64(Util.GetRandomNumber(1000, 2500));  // repair?
            router.Send(client, (ushort)AreaPacketId.recv_shop_notify_item_sell_price, res, ServerType.Area);
        }
Exemple #19
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            uint      targetInstanceId = packet.Data.ReadUInt32();
            NecClient targetClient     = Server.Clients.GetByCharacterInstanceId(targetInstanceId);

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(client.Character.unionId); //union instance id?
            res.WriteUInt32(targetInstanceId);        //TargetInstanceId

            Router.Send(client, (ushort)MsgPacketId.recv_union_request_invite_target_r, res, ServerType.Msg);


            IBuffer res2 = BufferProvider.Provide();

            res2.WriteInt32(client.Character.unionId);                         //ID of the Union
            res2.WriteUInt32(client.Character.InstanceId);                     //Reply to Instance Id for the invite
            res2.WriteFixedString($"by member {client.Character.Name}", 0x31); //size is 0x31
            res2.WriteFixedString(client.Union.Name, 0x5B);                    //size is 0x5B
            res2.WriteInt32(client.Character.unionId);                         //Unknown
            res2.WriteByte(99);                                                //Unknown
            res2.WriteCString(client.Union.Name);                              //max size 0x31

            Router.Send(targetClient, (ushort)MsgPacketId.recv_union_notify_invite, res2, ServerType.Msg);
        }
Exemple #20
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            int  Unknown1   = packet.Data.ReadInt32();
            uint instanceId = packet.Data.ReadUInt32();
            int  Unknown2   = packet.Data.ReadInt32();

            client.Character.eventSelectReadyCode = (uint)instanceId;
            Logger.Debug($"Just attacked Target {client.Character.eventSelectReadyCode}");


            int   damage = 0;
            float perHp  = 100.0f;
            int   seed   = Util.GetRandomNumber(0, 20);

            if (seed < 2)
            {
                damage = Util.GetRandomNumber(1, 4); // Light hit
            }
            else if (seed < 19)
            {
                damage = Util.GetRandomNumber(16, 24); // Normal hit
            }
            else
            {
                damage = Util.GetRandomNumber(32, 48); // Critical hit
            }
            //Testing some aoe damage stuff.......  Takes a long time to process.
            AttackObjectsInRange(client, damage);


            SendBattleAttackExecR(client);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            router.Send(client.map, (ushort)AreaPacketId.recv_party_mentor_remove_r, res, ServerType.Area);
        }
Exemple #22
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            byte  isBuyout = packet.data.ReadByte();
            int   slot     = packet.data.ReadInt32();
            ulong bid      = packet.data.ReadUInt64();

            _Logger.Debug(isBuyout + " " + slot + " " + bid);
            int         auctionError = 0;
            ItemService itemService  = new ItemService(client.character);

            try
            {
                itemService.Bid(isBuyout, slot, bid);
            }
            catch (AuctionException e)
            {
                auctionError = (int)e.type;
                _Logger.Debug(e.ToString());
            }

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(auctionError);
            router.Send(client.map, (ushort)AreaPacketId.recv_auction_bid_r, res, ServerType.Area);
        }
Exemple #23
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(1); //Continuous send of this packet if 0(time left is 0 if this is 0)
            Router.Send(client, (ushort)AreaPacketId.recv_quest_check_time_limit_r, res, ServerType.Area);
        }
Exemple #24
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            Router.Send(client, (ushort)AreaPacketId.recv_quest_display_r, res, ServerType.Area);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            //Router.Send(client.Map, (ushort) AreaPacketId.recv_auction_bid_r, res, ServerType.Area);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            int  unknown1   = packet.data.ReadInt32();
            uint instanceId = packet.data.ReadUInt32();
            int  unknown2   = packet.data.ReadInt32();

            client.character.eventSelectReadyCode = instanceId;
            _Logger.Debug($"Just attacked Target {client.character.eventSelectReadyCode}");


            int damage = client.character.battleParam.plusPhysicalAttack;
            int seed   = Util.GetRandomNumber(0, 20);

            if (seed < 2)
            {
                damage += Util.GetRandomNumber(1, 4); // Light hit
            }
            else if (seed < 19)
            {
                damage += Util.GetRandomNumber(16, 24); // Normal hit
            }
            else
            {
                damage *= 2;
            }
            damage += Util.GetRandomNumber(32, 48); // Critical hit
            if (client.account.state == AccountStateType.Admin)
            {
                damage *= 100;                                                 //testing death and revival is slow with low dmg.
            }
            AttackObjectsInRange(client, damage);


            SendBattleAttackExecR(client);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            router.Send(client, (ushort)AreaPacketId.recv_wanted_list_close_r, res, ServerType.Area);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteCString("ToBeFound");
            router.Send(client.map, (ushort)AreaPacketId.recv_event_system_message_timer, res, ServerType.Area);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0); // 0  = msg friend added

            Router.Send(client, (ushort)MsgPacketId.recv_friend_result_reply_link2, res, ServerType.Msg);

            /* Logic for all the possibilities below goes above here.
             * FRIEND_REGIST	10	Sent Friend Request to %s
             * FRIEND_REGIST	20	Denied the Friend Request
             * FRIEND_REGIST	2	Your Friend Request was cancelled
             * FRIEND_REGIST	1	Your Friend Request was not approved
             * FRIEND_REGIST	0	Added %s on your Friend List
             * FRIEND_REGIST	200	%s approved your Friend Request and was added to your Friend List.
             * FRIEND_REGIST	201	%s has denied your Friend Request
             * FRIEND_REGIST	202	Unable to add to Friend List
             * FRIEND_REGIST	-2101	%s is already on your Friend List
             * FRIEND_REGIST	-2102	You have already asked someone else to join your Friend List. Try again once that player has replied.
             * FRIEND_REGIST	-2103	Friend List full
             * FRIEND_REGIST	-2104	The other party's Friend List is full
             * FRIEND_REGIST	-2105	The targeted player is processing another Friend Request. Please try again later.
             * FRIEND_REGIST	-2106	%s has denied your Friend Request
             * FRIEND_REGIST	-2108	You have sent a Friend Request to %s
             * FRIEND_REGIST	GENERIC	Unable to add to Friend List
             */
        }
Exemple #30
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType fromZone      = (ItemZoneType)packet.data.ReadByte();
            byte         fromContainer = packet.data.ReadByte();
            short        fromSlot      = packet.data.ReadInt16();
            short        toSlot        = packet.data.ReadInt16();
            byte         quantity      = packet.data.ReadByte();

            ItemLocation fromLoc     = new ItemLocation(fromZone, fromContainer, fromSlot);
            ItemService  itemService = new ItemService(client.character);

            _itemInstance = itemService.GetIdentifiedItem(fromLoc); //To do; get regular item instead of identified item. Mark item as in trade.
            client.character.tradeWindowSlot[toSlot] = _itemInstance.instanceId;

            ItemLocation originalLocation = _itemInstance.location;

            _itemInstance.location = new ItemLocation(ItemZoneType.TradeWindow, 0, toSlot); //This is bad. it changes the stored location?

            NecClient targetClient = server.clients.GetByCharacterInstanceId((uint)client.character.eventSelectExecCode);

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0); // error check?
            router.Send(client, (ushort)AreaPacketId.recv_trade_add_item_r, res, ServerType.Area);

            if (targetClient != null)
            {
                RecvItemInstance itemInstance = new RecvItemInstance(targetClient, _itemInstance);
                router.Send(itemInstance);
            }

            _itemInstance.location = originalLocation;
        }