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);
        }
Exemple #2
0
        private void SendItems(NecClient client, int[] itemIds)
        {
            ItemSpawnParams[] spawmParams = new ItemSpawnParams[itemIds.Length];
            for (int i = 0; i < itemIds.Length; i++)
            {
                spawmParams[i] = new ItemSpawnParams();
                spawmParams[i].itemStatuses = ItemStatuses.Identified;
            }

            ItemService         itemService = new ItemService(client.character);
            List <ItemInstance> items       = itemService.SpawnItemInstances(ItemZoneType.AdventureBag, itemIds, spawmParams);

            RecvSituationStart recvSituationStart = new RecvSituationStart(2);

            router.Send(client, recvSituationStart.ToPacket());

            foreach (ItemInstance itemInstance in items)
            {
                _Logger.Debug(itemInstance.type.ToString());
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                router.Send(client, recvItemInstance.ToPacket());
            }

            RecvSituationEnd recvSituationEnd = new RecvSituationEnd();

            router.Send(client, recvSituationEnd.ToPacket());
        }
Exemple #3
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;
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemService  itemService = new ItemService(client.character);
            int          result      = 0;
            int          instanceId  = packet.data.ReadInt32();
            MonsterSpawn monster     = client.map.GetMonsterByInstanceId((uint)instanceId);

            _Logger.Debug($"{client.character.name} is trying to loot object {instanceId}.  Inventory Space {client.character.itemLocationVerifier.GetTotalFreeSpace(ItemZoneType.AdventureBag)}");
            ItemLocation nextOpenLocation = client.character.itemLocationVerifier.NextOpenSlot(ItemZoneType.AdventureBag);

            if (monster == null)
            {
                result = -10;
            }
            else if (monster.loot.itemCountRng == 0)
            {
                result = -1;
            }
            else if (nextOpenLocation.zoneType == ItemZoneType.InvalidZone)
            {
                result = -207;                                                             //expand to all inventory. TODO
            }
            IBuffer res2 = BufferProvider.Provide();

            res2.WriteInt32(result);
            router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res2, ServerType.Area);
            //LOOT, -1, I don't have anything. , SYSTEM_WARNING,
            //LOOT, -10, no route target, SYSTEM_WARNING,
            //LOOT, -207, There is no space in the inventory. , SYSTEM_WARNING,
            //LOOT, -1500, no root authority. , SYSTEM_WARNING,

            if (result == 0)
            {
                IBuffer res = BufferProvider.Provide();
                res.WriteInt32(2);
                router.Send(client, (ushort)AreaPacketId.recv_situation_start, res, ServerType.Area);

                int             itemId     = monster.loot.dropTableItemSerialIds[monster.loot.itemCountRng];
                ItemSpawnParams spawmParam = new ItemSpawnParams();
                spawmParam.itemStatuses = ItemStatuses.Identified;
                ItemInstance itemInstance = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, itemId, spawmParam);
                _Logger.Debug(itemInstance.type.ToString());
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                router.Send(client, recvItemInstance.ToPacket());
                monster.loot.itemCountRng--; //decrement available items

                res = BufferProvider.Provide();
                router.Send(client, (ushort)AreaPacketId.recv_situation_end, res, ServerType.Area);
            }
        }
Exemple #5
0
        public List <PacketResponse> GetMoveResponses(NecClient client, MoveResult moveResult)
        {
            List <PacketResponse> responses = new List <PacketResponse>();

            switch (moveResult.type)
            {
            case MoveType.Place:
                RecvItemUpdatePlace recvItemUpdatePlace = new RecvItemUpdatePlace(client, moveResult.destItem);
                responses.Add(recvItemUpdatePlace);
                break;

            case MoveType.Swap:
                RecvItemUpdatePlaceChange recvItemUpdatePlaceChange = new RecvItemUpdatePlaceChange(client, moveResult.originItem, moveResult.destItem);
                responses.Add(recvItemUpdatePlaceChange);
                break;

            case MoveType.PlaceQuantity:
                RecvItemUpdateNum recvItemUpdateNum = new RecvItemUpdateNum(client, moveResult.originItem);
                responses.Add(recvItemUpdateNum);
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, moveResult.destItem);
                responses.Add(recvItemInstance);
                break;

            case MoveType.AddQuantity:
                RecvItemUpdateNum recvItemUpdateNum0 = new RecvItemUpdateNum(client, moveResult.originItem);
                responses.Add(recvItemUpdateNum0);
                RecvItemUpdateNum recvItemUpdateNum1 = new RecvItemUpdateNum(client, moveResult.destItem);
                responses.Add(recvItemUpdateNum1);
                break;

            case MoveType.AllQuantity:
                RecvItemRemove recvItemRemove = new RecvItemRemove(client, moveResult.originItem);
                responses.Add(recvItemRemove);
                RecvItemUpdateNum recvItemUpdateNum2 = new RecvItemUpdateNum(client, moveResult.destItem);
                responses.Add(recvItemUpdateNum2);
                break;

            case MoveType.None:
                break;
            }

            return(responses);
        }
        public void LoadInventory(NecClient client, NecServer server)
        {
            ItemService         itemService = new ItemService(client.character);
            List <ItemInstance> ownedItems  = itemService.LoadOwneditemInstances(server);

            foreach (ItemInstance itemInstance in ownedItems)
            {
                if (itemInstance.statuses.HasFlag(ItemStatuses.Unidentified))
                {
                    RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, itemInstance);
                    router.Send(client, recvItemInstanceUnidentified.ToPacket());
                    _Logger.Debug($" Unidentified item : {itemInstance.location.zoneType}");
                }
                else
                {
                    RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                    router.Send(client, recvItemInstance.ToPacket());
                }
            }
        }
Exemple #7
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            byte  index = packet.data.ReadByte();
            ulong price = packet.data.ReadUInt64();
            byte  count = packet.data.ReadByte();

            client.character.adventureBagGold -= count * price;
            server.database.UpdateCharacter(client.character);

            RecvSelfMoneyNotify recvSelfMoneyNotify = new RecvSelfMoneyNotify(client, client.character.adventureBagGold);

            router.Send(recvSelfMoneyNotify, client);

            if (client.character.shopItemIndex != null)
            {
                int             itemId     = client.character.shopItemIndex[index];
                ItemSpawnParams spawmParam = new ItemSpawnParams();
                spawmParam.itemStatuses = ItemStatuses.Identified;
                spawmParam.quantity     = count;
                ItemService  itemService  = new ItemService(client.character);
                ItemInstance itemInstance = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, itemId, spawmParam);

                RecvSituationStart recvSituationStart = new RecvSituationStart(2);
                router.Send(client, recvSituationStart.ToPacket());

                RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                router.Send(client, recvItemInstance.ToPacket());

                RecvSituationEnd recvSituationEnd = new RecvSituationEnd();
                router.Send(client, recvSituationEnd.ToPacket());
            }

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            router.Send(client, (ushort)AreaPacketId.recv_shop_buy_r, res, ServerType.Area);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            byte notifyProblemSysMsg   = 0;
            int  clientItemCount       = 0;
            int  targetClientItemcount = 0;

            NecClient   targetClient      = server.clients.GetByCharacterInstanceId((uint)client.character.eventSelectExecCode);
            ItemService itemService       = new ItemService(client.character);
            ItemService targetItemService = new ItemService(targetClient.character);

            RecvTradeNotifyFixed notifyFixed  = new RecvTradeNotifyFixed(0);
            RecvTradeFix         recvTradeFix = new RecvTradeFix();

            for (int i = 0; i < 20; i++)
            {
                if (client.character.tradeWindowSlot[i] > 0)
                {
                    clientItemCount++;
                }
                if (targetClient.character.tradeWindowSlot[i] > 0)
                {
                    targetClientItemcount++;
                }
            }

            _Logger.Debug($"Transferred items {clientItemCount}:{targetClientItemcount}");
            _Logger.Debug($"Free Space{client.character.itemLocationVerifier.GetTotalFreeSpace(ItemZoneType.AdventureBag)}:{targetClient.character.itemLocationVerifier.GetTotalFreeSpace(ItemZoneType.AdventureBag)}");

            //ToDo:  improve this logic when GetTotalFreeSpace can check all bags
            if (client.character.itemLocationVerifier.GetTotalFreeSpace(ItemZoneType.AdventureBag) < targetClientItemcount - clientItemCount)
            {
                notifyProblemSysMsg = 1;                                                                                                                               //doesnt work. GetTotalFreeSpace is not accurate. problem with itemService.PutLootedItem updating count.
            }
            if (targetClient.character.itemLocationVerifier.GetTotalFreeSpace(ItemZoneType.AdventureBag) < clientItemCount - targetClientItemcount)
            {
                notifyProblemSysMsg = 1;
            }
            //ToDo:  add other trade preventing scenarios here


            RecvTradeNotifyProblem recvTradeNotifyProblem = new RecvTradeNotifyProblem(0, notifyProblemSysMsg);

            router.Send(client, recvTradeNotifyProblem.ToPacket());
            if (targetClient != null)
            {
                router.Send(targetClient, recvTradeNotifyProblem.ToPacket());
            }


            if (notifyProblemSysMsg == 0)
            {
                //player 1 sends
                router.Send(client, notifyFixed.ToPacket());
                router.Send(client, recvTradeFix.ToPacket());

                //player 2 sends
                if (targetClient != null)
                {
                    router.Send(targetClient, notifyFixed.ToPacket());
                    router.Send(targetClient, recvTradeFix.ToPacket());
                }

                //Get stuff from targetClient
                for (int i = 0; i < 20; i++)
                {
                    ItemInstance itemInstance = targetClient.character.itemLocationVerifier.GetItemByInstanceId(targetClient.character.tradeWindowSlot[i]);
                    if (itemInstance != null)
                    {
                        RecvItemRemove recvItemRemove = new RecvItemRemove(targetClient, itemInstance);
                        if (targetClient != null)
                        {
                            router.Send(recvItemRemove);
                        }

                        targetClient.character.itemLocationVerifier.RemoveItem(itemInstance);

                        //put the item in the new owners inventory
                        itemInstance = itemService.PutLootedItem(itemInstance);

                        RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                        router.Send(client, recvItemInstance.ToPacket());
                    }

                    //}
                    //give stuff to targetClient
                    //for (int i = 0; i < 20; i++)
                    //{
                    ItemInstance itemInstance2 = client.character.itemLocationVerifier.GetItemByInstanceId(client.character.tradeWindowSlot[i]);
                    if (itemInstance2 != null)
                    {
                        RecvItemRemove recvItemRemove2 = new RecvItemRemove(client, itemInstance2);
                        if (client != null)
                        {
                            router.Send(recvItemRemove2);
                        }

                        client.character.itemLocationVerifier.RemoveItem(itemInstance2);

                        //put the item in the new owners inventory
                        itemInstance2 = targetItemService.PutLootedItem(itemInstance2);

                        RecvItemInstance recvItemInstance2 = new RecvItemInstance(targetClient, itemInstance2);
                        if (targetClient != null)
                        {
                            router.Send(targetClient, recvItemInstance2.ToPacket());
                        }
                    }
                }

                client.character.tradeWindowSlot       = new ulong[20];
                targetClient.character.tradeWindowSlot = new ulong[20];

                Task.Delay(TimeSpan.FromSeconds(5)).ContinueWith
                    (t1 =>
                {
                    RecvEventEnd eventEnd = new RecvEventEnd(0);
                    if (targetClient != null)
                    {
                        router.Send(targetClient, eventEnd.ToPacket());
                    }
                    router.Send(client, eventEnd.ToPacket());
                }
                    );
            }
        }
        public override void Execute(string[] command, NecClient client, ChatMessage message,
                                     List <ChatResponse> responses)
        {
            if (command.Length < 1)
            {
                responses.Add(ChatResponse.CommandError(client, "To few arguments"));
                return;
            }

            if (!int.TryParse(command[0], out int itemId))
            {
                responses.Add(ChatResponse.CommandError(client, $"Invalid Number: {command[0]}"));
                return;
            }

            if (client.character == null)
            {
                responses.Add(ChatResponse.CommandError(client, "Character is null"));
                return;
            }

            if (!server.settingRepository.itemInfo.ContainsKey(itemId))
            {
                responses.Add(ChatResponse.CommandError(client, $"ItemId: '{itemId}' does not exist"));
                return;
            }


            ItemSpawnParams spawmParam = new ItemSpawnParams();

            spawmParam.itemStatuses = ItemStatuses.Identified;
            if (command.Length > 1 && command[1] == "u")
            {
                spawmParam.itemStatuses = ItemStatuses.Unidentified;
            }

            ItemService  itemService      = new ItemService(client.character);
            ItemInstance itemInstance     = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, itemId, spawmParam);
            byte         itemZoneOverride = 0;
            IBuffer      res = BufferProvider.Provide();

            res.WriteInt32(2);
            router.Send(client, (ushort)AreaPacketId.recv_situation_start, res, ServerType.Area);

            if (command.Length > 1 && command[1] == "u")
            {
                if (command.Length > 2 && command[2] != "")
                {
                    itemZoneOverride = byte.Parse(command[2]);
                }
                else
                {
                    itemZoneOverride = (byte)itemInstance.location.zoneType;
                }
                _Logger.Debug(itemInstance.type.ToString());
                RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, itemInstance);
                router.Send(client, recvItemInstanceUnidentified.ToPacket());
            }
            else
            {
                _Logger.Debug(itemInstance.type.ToString());
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                router.Send(client, recvItemInstance.ToPacket());
            }

            res = BufferProvider.Provide();
            router.Send(client, (ushort)AreaPacketId.recv_situation_end, res, ServerType.Area);
        }
Exemple #10
0
        public override void Execute(string[] command, NecClient client, ChatMessage message,
                                     List <ChatResponse> responses)
        {
            ItemService         itemService = new ItemService(client.character);
            List <ItemInstance> lots        = itemService.GetLots();
            List <ItemInstance> bids        = itemService.GetBids();
            List <AuctionEquipmentSearchConditions> equipSearch = itemService.GetEquipmentSearchConditions();
            List <AuctionItemSearchConditions>      itemSearch  = itemService.GetItemSearchConditions();
            const byte IS_IN_MAINTENANCE_MODE = 0x0;
            const int  MAX_LOTS = 15;

            IBuffer res = BufferProvider.Provide();

            foreach (ItemInstance lotItem in lots)
            {
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, lotItem);
                router.Send(recvItemInstance);
            }

            int j = 0;

            res.WriteInt32(lots.Count); //Less than or equal to 15
            foreach (ItemInstance lotItem in lots)
            {
                res.WriteByte((byte)j); // row number?
                res.WriteInt32(j);      // row number ??
                res.WriteUInt64(lotItem.instanceId);
                res.WriteUInt64(lotItem.minimumBid);
                res.WriteUInt64(lotItem.buyoutPrice);
                res.WriteFixedString(lotItem.consignerSoulName, 49);
                res.WriteByte(0);                          // criminal status of seller?
                res.WriteFixedString(lotItem.comment, 385);
                res.WriteInt16((short)lotItem.currentBid); // Bid why convert to short?
                res.WriteInt32(lotItem.secondsUntilExpiryTime);

                res.WriteInt64(0); //unknown
                res.WriteInt32(0); //unknown
                res.WriteInt32(0); //unknown
                j++;
            }

            foreach (ItemInstance bidItem in bids)
            {
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, bidItem);
                router.Send(recvItemInstance);
            }

            j = 0;
            res.WriteInt32(bids.Count); //Less than or equal to 0xE
            foreach (ItemInstance bidItem in bids)
            {
                res.WriteByte((byte)j); // row number?
                res.WriteInt32(j);      // row number ??
                res.WriteUInt64(bidItem.instanceId);
                res.WriteUInt64(bidItem.minimumBid);
                res.WriteUInt64(bidItem.buyoutPrice);
                res.WriteFixedString(bidItem.consignerSoulName, 49);
                res.WriteByte(0);                      // criminal status of seller?
                res.WriteFixedString(bidItem.comment, 385);
                res.WriteInt16((short)bidItem.maxBid); // The current bid, why convert to short?
                res.WriteInt32(bidItem.secondsUntilExpiryTime);

                res.WriteInt64(bidItem.currentBid); //Your current bid
                res.WriteInt32(0);                  //0: you are the highest bidder, 1: you won the item, 2: you were outbid, 3: seller cancelled
                j++;
            }

            res.WriteInt32(equipSearch.Count); //Less than or equal to 0x8
            foreach (AuctionEquipmentSearchConditions equipCond in equipSearch)
            {
                res.WriteFixedString(equipCond.text, AuctionEquipmentSearchConditions.MAX_TEXT_LENGTH); //V| Search Text
                res.WriteByte(equipCond.forgePriceMin);                                                 //V| Grade min
                res.WriteByte(equipCond.forgePriceMax);                                                 //V| Grade max
                res.WriteByte(equipCond.soulRankMin);                                                   //V| Level min
                res.WriteByte(equipCond.soulRankMax);                                                   //V| Level max
                res.WriteInt32((int)equipCond.@class);                                                  // class?
                res.WriteInt16((short)equipCond.race);                                                  // race?
                res.WriteInt16((short)equipCond.qualities);                                             //V| Qualities
                res.WriteUInt64(equipCond.goldCost);                                                    //V| Gold
                res.WriteByte(Convert.ToByte(equipCond.isLessThanGoldCost));

                res.WriteByte(Convert.ToByte(equipCond.hasGemSlot));                                                  //V| Effectiveness
                res.WriteByte((byte)equipCond.gemSlotType1);                                                          //V| Gem slot 1
                res.WriteByte((byte)equipCond.gemSlotType2);                                                          //V| Gem slot 2
                res.WriteByte((byte)equipCond.gemSlotType3);                                                          //V| Gem slot 3

                res.WriteInt64(0);                                                                                    //TODO UNKNOWN
                res.WriteInt64(0);
                res.WriteFixedString(equipCond.description, AuctionEquipmentSearchConditions.MAX_DESCRIPTION_LENGTH); //v| Saved Search Description
                res.WriteByte(0);                                                                                     //TODO UNKNOWN
                res.WriteByte(0);                                                                                     //TODO UNKNOWN
            }


            //item search conditions
            int numEntries = 1;

            res.WriteInt32(numEntries); //Less than or equal to 0x8

            for (int i = 0; i < numEntries; i++)
            {
                res.WriteFixedString("fs0x49V2", 0x49);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteInt64(0);
                res.WriteByte(0);
                res.WriteInt64(0);
                res.WriteInt64(0);
                res.WriteFixedString("fs0xC1V2", 0xC1); //Fixed string of 0xC1 or 0xC1 bytes.
                res.WriteByte(0);
                res.WriteByte(0);
            }

            res.WriteByte(0); //Bool
            res.WriteInt32(0);
            router.Send(client, (ushort)AreaPacketId.recv_auction_notify_open, res, ServerType.Area);

            RecvAuctionNotifyOpenItemStart recvAuctionNotifyOpenItemStart = new RecvAuctionNotifyOpenItemStart(client);
            RecvAuctionNotifyOpenItemEnd   recvAuctionNotifyOpenItemEnd   = new RecvAuctionNotifyOpenItemEnd(client);

            List <ItemInstance> auctionList = itemService.GetItemsUpForAuction();

            j = 0;
            client.character.auctionSearchIds = new ulong[auctionList.Count];
            foreach (ItemInstance auctionItem in auctionList)
            {
                client.character.auctionSearchIds[j] = auctionItem.instanceId;
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, auctionItem);
                router.Send(recvItemInstance);
                j++;
            }

            router.Send(recvAuctionNotifyOpenItemStart);
            int divideBy100 = auctionList.Count / 100 + (auctionList.Count % 100 == 0 ? 0 : 1); // TOTAL NUMBER OF RECVS TO SEND

            for (int i = 0; i < divideBy100; i++)
            {
                RecvAuctionNotifyOpenItem recvAuctionNotifyOpenItem;
                if (i == divideBy100 - 1)
                {
                    recvAuctionNotifyOpenItem = new RecvAuctionNotifyOpenItem(client, auctionList.GetRange(i, auctionList.Count % 100));
                }
                else
                {
                    recvAuctionNotifyOpenItem = new RecvAuctionNotifyOpenItem(client, auctionList.GetRange(i, 100));
                }
                router.Send(recvAuctionNotifyOpenItem);
            }

            router.Send(recvAuctionNotifyOpenItemEnd);
        }
        private void RandomItemGuy(NecClient client, NpcSpawn npcSpawn)
        {
            ItemSpawnParams spawmParam = new ItemSpawnParams();

            spawmParam.itemStatuses = ItemStatuses.Unidentified;
            ItemService  itemService  = new ItemService(client.character);
            ItemInstance itemInstance = null;

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(2);
            router.Send(client, (ushort)AreaPacketId.recv_situation_start, res, ServerType.Area);

            ItemLocation nextOpenLocation = client.character.itemLocationVerifier.NextOpenSlot(ItemZoneType.AdventureBag);

            if (nextOpenLocation.zoneType == ItemZoneType.InvalidZone)
            {
                res = BufferProvider.Provide();
                res.WriteCString($"Your Adventure Bag is full.  Go away already! {client.soul.name}");     // Length 0xC01
                router.Send(client, (ushort)AreaPacketId.recv_event_system_message, res, ServerType.Area); // show system message on middle of the screen.
            }
            else
            {
                if (client.character.eventSelectExecCode == 0)
                {
                    List <ItemInfoSetting> weaponlist = new List <ItemInfoSetting>();
                    foreach (ItemInfoSetting weapon in server.settingRepository.itemInfo.Values)
                    {
                        if ((weapon.id > 10100101) & (weapon.id < 15300101))
                        {
                            weaponlist.Add(weapon);
                        }
                    }

                    int baseId = weaponlist[Util.GetRandomNumber(0, weaponlist.Count)].id;
                    itemInstance = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, baseId, spawmParam);

                    RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, itemInstance);
                    router.Send(client, recvItemInstanceUnidentified.ToPacket());
                }
                else if (client.character.eventSelectExecCode == 1)
                {
                    List <ItemInfoSetting> armorList = new List <ItemInfoSetting>();
                    foreach (ItemInfoSetting armor in server.settingRepository.itemInfo.Values)
                    {
                        if ((armor.id > 16100101) & (armor.id < 30499901))
                        {
                            armorList.Add(armor);
                        }
                    }

                    int baseId = armorList[Util.GetRandomNumber(0, armorList.Count)].id;
                    itemInstance = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, baseId, spawmParam);

                    RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, itemInstance);
                    router.Send(client, recvItemInstanceUnidentified.ToPacket());
                }
                else if (client.character.eventSelectExecCode == 2)
                {
                    //50401040,Moist Cudgel
                    int baseId = 50401040; //This can select from a small array of items, and a small array of custom names
                    spawmParam.itemStatuses = ItemStatuses.Identified;
                    itemInstance            = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, baseId, spawmParam);

                    RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                    router.Send(client, recvItemInstance.ToPacket());
                }

                if (itemInstance == null)
                {
                    res = BufferProvider.Provide();
                    res.WriteCString("Better Luck Next Time.  I ran out of items!");                           // Length 0xC01
                    router.Send(client, (ushort)AreaPacketId.recv_event_system_message, res, ServerType.Area); // show system message on middle of the screen.
                    res = BufferProvider.Provide();
                    router.Send(client, (ushort)AreaPacketId.recv_situation_end, res, ServerType.Area);
                    RecvEventEnd(client); //End The Event
                    return;
                }

                res = BufferProvider.Provide();
                res.WriteCString($"Enjoy your new Super {itemInstance.unidentifiedName}");                 // Length 0xC01
                router.Send(client, (ushort)AreaPacketId.recv_event_system_message, res, ServerType.Area); // show system message on middle of the screen.
            }

            res = BufferProvider.Provide();
            router.Send(client, (ushort)AreaPacketId.recv_situation_end, res, ServerType.Area);
            RecvEventEnd(client); //End The Event
        }