예제 #1
0
        public void Move(NecServer server, NecClient client)
        {
            InventoryItem fromInvItem = client.Character.GetInventoryItem(fromStoreType, fromBagId, fromSlot);
            InventoryItem toInvItem   = client.Character.GetInventoryItem(toStoreType, toBagId, toSlot);

            if (toInvItem != null && (fromInvItem.StorageCount + toInvItem.StorageCount > 255))
            {
                RecvNormalSystemMessage unlikeItems =
                    new RecvNormalSystemMessage("The move would place too many items in destination slot!");
                server.Router.Send(unlikeItems, client);
                return;
            }

            if (fromInvItem.StorageCount == itemCount)
            {
                if (toInvItem != null)
                {
                    toInvItem.StorageCount =
                        (byte)(fromInvItem.StorageCount +
                               toInvItem.StorageCount);  // huh??? byte - byte is cast as int????
                    RecvItemUpdateNum itemNum = new RecvItemUpdateNum(toInvItem.InstanceId, toInvItem.StorageCount);
                    server.Router.Send(itemNum, client);
                    RecvItemRemove removeItem = new RecvItemRemove(fromInvItem.InstanceId);
                    server.Router.Send(removeItem, client);
                    client.Character.RemoveInventoryItem(fromInvItem);
                    client.Character.UpdateInventoryItem(toInvItem);
                }
                else
                {
                    fromInvItem.StorageType = toStoreType;
                    fromInvItem.StorageId   = toBagId;
                    fromInvItem.StorageSlot = toSlot;
                    RecvItemUpdatePlace itemPlace = new RecvItemUpdatePlace(fromInvItem.InstanceId,
                                                                            fromInvItem.StorageType, fromInvItem.StorageId, fromInvItem.StorageSlot);
                    server.Router.Send(itemPlace, client);
                    client.Character.UpdateInventoryItem(fromInvItem);
                }
            }
            else
            {
                byte remainCount =
                    (byte)(fromInvItem.StorageCount - itemCount);  // huh??? byte - byte is cast as int????
                if (toInvItem != null)
                {
                    toInvItem.StorageCount =
                        (byte)(itemCount + toInvItem.StorageCount);  // huh??? byte - byte is cast as int????
                    fromInvItem.StorageCount = remainCount;
                    RecvItemUpdateNum toItemNum = new RecvItemUpdateNum(toInvItem.InstanceId, toInvItem.StorageCount);
                    server.Router.Send(toItemNum, client);
                    RecvItemUpdateNum fromItemNum =
                        new RecvItemUpdateNum(fromInvItem.InstanceId, fromInvItem.StorageCount);
                    server.Router.Send(fromItemNum, client);
                    client.Character.RemoveInventoryItem(fromInvItem);
                    client.Character.UpdateInventoryItem(toInvItem);
                }
                else
                {
                    RecvItemUpdateNum updateNum = new RecvItemUpdateNum(fromInvItem.InstanceId, remainCount);
                    server.Router.Send(updateNum, client);
                    InventoryItem newInvItem = client.Character.GetNextInventoryItem(server);
                    newInvItem.StorageCount = (byte)itemCount;
                    newInvItem.StorageType  = toStoreType;
                    newInvItem.StorageId    = toBagId;
                    newInvItem.StorageSlot  = toSlot;
                    newInvItem.StorageItem  = item;
                    RecvItemInstanceUnidentified itemUnidentified = new RecvItemInstanceUnidentified(newInvItem);
                    server.Router.Send(itemUnidentified, client);
                    fromInvItem.StorageCount = remainCount;
                    client.Character.UpdateInventoryItem(fromInvItem);
                }
            }
        }
예제 #2
0
        public Item SendItemInstance(NecClient client, int itemId, int itemType, string name)
        {
            IBuffer res = BufferProvider.Provide();

            //Item item = _server.Instances64.CreateInstance<Item>();
            invItem = client.Character.GetNextInventoryItem(_server);
            if (invItem == null)
            {
                res = BufferProvider.Provide();
                res.WriteInt32(-207);
                Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area);
                RecvNormalSystemMessage noSpace = new RecvNormalSystemMessage("Inventory is full!!!!");
                _server.Router.Send(noSpace, client);
                return(null);
            }

            Item item = invItem.StorageItem = _server.Instances64.CreateInstance <Item>();

            Logger.Debug($"invItem.StorageId [{invItem.StorageId}] invItem.StorageSlot [{invItem.StorageSlot}]");
            item.Id              = itemId;
            item.IconType        = itemType;
            item.Name            = name;
            invItem.StorageType  = 0;
            invItem.StorageCount = (byte)1;

            //ulong instanceId = invItem.InstanceId << 32 | 0xffffffff;
            Logger.Debug($"instanceId [{invItem.InstanceId}]");
            //res.WriteInt32(instanceId); //InstanceId
            // res.WriteInt32(10200101); //ItemID
            res.WriteUInt64(invItem.InstanceId);          //ItemID
            res.WriteInt32(invItem.StorageItem.IconType); // 0 does not display icon
            res.WriteByte((byte)1);                       //Number of "items"
            res.WriteInt32(0);                            //Item status, in multiples of numbers, 8 = blessed/cursed/both
            res.WriteFixedString(name + "          ", 0x10);
            res.WriteByte(invItem.StorageType);           // 0 = adventure bag. 1 = character equipment
            res.WriteByte(invItem.StorageId);             // 0~2 // maybe.. more bag index?
            res.WriteInt16(invItem.StorageSlot);          // bag index
            res.WriteInt32(0);                            //Slot spots? 10200101 here caused certain spots to have an item, -1 for all slots(avatar included)                          /13
            res.WriteInt32(invItem.StorageItem
                           .Id);                          //Percentage stat, 9 max i think                                                                        /12
            res.WriteByte(36);                            //1
            res.WriteByte(37);                            // Dest slot
            res.WriteCString(
                name);                                    // find max size                                                                                                        //11    10 byte fixed string
            res.WriteInt16(38);                           //10
            res.WriteInt16(39);                           //9
            res.WriteInt32(
                32);                                      //Divides max % by this number                                                                                              //8
            res.WriteByte(40);                            //7
            res.WriteInt32(33);                           //6
            int numEntries = 0;

            res.WriteInt32(numEntries); // less than or equal to 2

            for (int i = 0; i < numEntries; i++)
            {
                res.WriteInt32(34 + i);
            }
            //res.WriteInt32(0);

            numEntries = 0;
            res.WriteInt32(numEntries); // less than or equal to 3
            for (int i = 0; i < numEntries; i++)
            {
                res.WriteByte(0); //bool
                res.WriteInt32(0);
                res.WriteInt32(0);
                res.WriteInt32(0);
            }

            res.WriteInt32(34); //4
            res.WriteInt32(35); //5
            res.WriteInt16(41);
            res.WriteInt32(
                43);            //Guard protection toggle, 1 = on, everything else is off                                                                   //3
            res.WriteInt16(42); //2

            Router.Send(client, (ushort)AreaPacketId.recv_item_instance, res, ServerType.Area);

            //ConfigureItem(client, item.InstanceId);
            //client.Character.inventoryItems.Add(invItem);
            return(invItem.StorageItem);
        }
예제 #3
0
        public Item SendItemInstanceUnidentified(NecClient client, int itemId, int count, int itemType, string name)
        {
            IBuffer res = null;

            invItem = client.Character.GetNextInventoryItem(_server);
            if (invItem == null)
            {
                res = BufferProvider.Provide();
                res.WriteInt32(-207);
                Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area);
                RecvNormalSystemMessage noSpace = new RecvNormalSystemMessage("Inventory is full!!!!");
                _server.Router.Send(noSpace, client);
                return(null);
            }

            Item item = invItem.StorageItem = _server.Instances64.CreateInstance <Item>();

            Logger.Debug($"invItem.StorageId [{invItem.StorageId}] invItem.StorageSlot [{invItem.StorageSlot}]");
            item.Id              = itemId;
            item.IconType        = itemType;
            item.Name            = name;
            invItem.StorageType  = 0;
            invItem.StorageCount = (byte)count;
            res = null;
            res = BufferProvider.Provide();

            //res.WriteInt64(dropItem.Item.Id); //Item Object Instance ID
            res.WriteUInt64(invItem.InstanceId); //Item Object Instance ID

            res.WriteCString(name);              //Name

            //res.WriteInt32(dropItem.Item.IconType);
            res.WriteInt32(item.IconType); //item type

            res.WriteInt32(1);

            res.WriteByte(invItem.StorageCount); //Number of items

            res.WriteInt32(0);                   //Item status 0 = identified

            res.WriteInt32(item.Id);             //Item icon 50100301 = camp
            res.WriteByte(1);
            res.WriteByte(1);
            res.WriteByte(1);
            res.WriteInt32(1);
            res.WriteByte(1);
            res.WriteByte(1);
            res.WriteByte(1);

            res.WriteByte(1);
            res.WriteByte(1);
            res.WriteByte(1); // bool
            res.WriteByte(1);
            res.WriteByte(1);
            res.WriteByte(1);
            res.WriteByte(1);
            res.WriteByte(0);

            res.WriteByte(invItem.StorageType);  // 0 = adventure bag. 1 = character equipment
            res.WriteByte(invItem.StorageId);    // 0~2
            res.WriteInt16(invItem.StorageSlot); // bag index
            res.WriteInt32(0);                   //bit mask. This indicates where to put items.   e.g. 01 head 010 arm 0100 feet etc (0 for not equipped)

            res.WriteInt64(0);

            res.WriteInt32(0);

            Router.Send(client, (ushort)AreaPacketId.recv_item_instance_unidentified, res, ServerType.Area);
            ConfigureItem(client, invItem.InstanceId);

            //client.Character.inventoryItems.Add(invItem);
            //client.Character.EquipId[0] = 10200101;
            //RecvDataNotifyCharaData myCharacterData = new RecvDataNotifyCharaData(client.Character, client.Soul.Name,false);
            //Router.Send(myCharacterData, client);

            //UpdateEqMask(client);
            return(item);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            int instanceID = packet.Data.ReadInt32();

            Logger.Debug($"{client.Character.Name} is {client.Character.Alignmentid}");


            IBuffer res = null;

            //res2.WriteInt32(instanceID);

            //Router.Send(client, (ushort) AreaPacketId.recv_loot_access_object_r, res2, ServerType.Area);

            res = BufferProvider.Provide();
            res.WriteInt32(instanceID);

            Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area);

            MonsterSpawn monster = client.Map.GetMonsterByInstanceId((uint)instanceID);

            DropTables dropTable = new DropTables(_server);
            DropItem   dropItem  = dropTable.GetLoot(monster.MonsterId);

            if (dropItem == null)
            {
                return;
            }
            InventoryItem invItem =
                client.Character.GetNextInventoryItem(_server, (byte)dropItem.NumItems, dropItem.Item);

            if (invItem == null)
            {
                res = BufferProvider.Provide();
                res.WriteInt32(-207);
                Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area);

                RecvNormalSystemMessage noSpace = new RecvNormalSystemMessage("Inventory is full!!!!");
                _server.Router.Send(noSpace, client);
                return;
            }

            string lootMsg = $"Looted {dropItem.NumItems} {dropItem.Item.Name} from {monster.Name}.";

            Logger.Debug($"Loot is {dropItem.NumItems} of {dropItem.Item.Id}");

            if (dropItem.Item.Id == 1)
            {
                client.Character.AdventureBagGold += dropItem.NumItems;
                RecvSelfMoneyNotify addMoney = new RecvSelfMoneyNotify(client.Character.AdventureBagGold);
                Router.Send(addMoney, client);
            }
            else
            {
                res = null;
                res = BufferProvider.Provide();

                //res.WriteInt64(dropItem.Item.Id); //Item Object Instance ID
                res.WriteUInt64(dropItem.Item.InstanceId); //Item Object Instance ID

                res.WriteCString(dropItem.Item.Name);      //Name

                //res.WriteInt32(dropItem.Item.IconType);
                res.WriteInt32(dropItem.Item.IconType); //item type

                res.WriteInt32(0);

                res.WriteByte((byte)dropItem.NumItems); //Number of items

                res.WriteInt32(0);                      //Item status 0 = identified

                res.WriteInt32(dropItem.Item.Id);       //Item icon 50100301 = camp
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteInt32(0);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);

                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(1); // bool
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);

                res.WriteByte(invItem.StorageType);  // 0 = adventure bag. 1 = character equipment
                res.WriteByte(invItem.StorageId);    // 0~2
                res.WriteInt16(invItem.StorageSlot); // bag index
                res.WriteInt32(
                    0);                              //bit mask. This indicates where to put items.   e.g. 01 head 010 arm 0100 feet etc (0 for not equipped)

                res.WriteInt64(0);

                res.WriteInt32(0);

                Router.Send(client, (ushort)AreaPacketId.recv_item_instance_unidentified, res, ServerType.Area);
            }

            RecvMonsterStateUpdateNotify monsterState = new RecvMonsterStateUpdateNotify((uint)instanceID, 1);

            Router.Send(client.Map, monsterState);

            if (dropItem.Item.Id != 1)
            {
                //RecvPartyNotifyGetItem itemMsg = new RecvPartyNotifyGetItem(dropItem.Item.Id, dropItem.Item.Name, (byte)dropItem.NumItems);

                RecvPartyNotifyAddDrawItem itemMsg = new RecvPartyNotifyAddDrawItem(dropItem.Item.InstanceId, 30.0F, 0);
                _server.Router.Send(itemMsg, client);
            }
        }
예제 #5
0
        public Item SendItemInstance(NecClient client)
        {
            IBuffer       res     = null;
            InventoryItem invItem = client.Character.GetNextInventoryItem(_server);

            if (invItem == null)
            {
                res = BufferProvider.Provide();
                res.WriteInt32(-207);
                Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area);
                RecvNormalSystemMessage noSpace = new RecvNormalSystemMessage("Inventory is full!!!!");
                _server.Router.Send(noSpace, client);
                return(null);
            }

            Item item = invItem.StorageItem = _server.Instances64.CreateInstance <Item>();

            item.Id             = 50100501;
            item.IconType       = 47;
            item.Name           = "bag";
            invItem.StorageType = 0;
            Logger.Debug($"instanceId [{invItem.InstanceId}]");
            res = BufferProvider.Provide();
            res.WriteUInt64(item.InstanceId);    //ItemID
            res.WriteInt32(2);                   // 0 does not display icon
            res.WriteByte((byte)1);              //Number of "items"
            res.WriteInt32(0);                   //Item status, in multiples of numbers, 8 = blessed/cursed/both
            res.WriteFixedString("Wolfzen", 0x10);
            res.WriteByte(invItem.StorageType);  // 0 = adventure bag. 1 = character equipment
            res.WriteByte(invItem.StorageId);    // 0~2 // maybe.. more bag index?
            res.WriteInt16(invItem.StorageSlot); // bag index
            res.WriteInt32(0);                   //Equip bitmask
            res.WriteInt32(item.Id);             //Percentage stat, 9 max i think
            res.WriteByte(0);
            res.WriteByte(0);                    // Dest slot
            res.WriteCString(item.Name);         // find max size
            res.WriteInt16(0);
            res.WriteInt16(0);
            res.WriteInt32(item.IconType); //Divides max % by this number
            res.WriteByte(0);
            res.WriteInt32(item.IconType);
            int numEntries = 2;

            res.WriteInt32(numEntries); // less than or equal to 2

            for (int i = 0; i < numEntries; i++)
            {
                res.WriteInt32(0);
            }
            //res.WriteInt32(0);

            numEntries = 3;
            res.WriteInt32(numEntries); // less than or equal to 3
            for (int i = 0; i < numEntries; i++)
            {
                res.WriteByte(0); //bool
                res.WriteInt32(0);
                res.WriteInt32(0);
                res.WriteInt32(0);
            }

            res.WriteInt32(0);
            res.WriteInt32(0);
            res.WriteInt16(0);
            res.WriteInt32(0); //Guard protection toggle, 1 = on, everything else is off
            res.WriteInt16(0);

            Router.Send(client, (ushort)AreaPacketId.recv_item_instance, res, ServerType.Area);

            return(item);
        }
예제 #6
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            byte
                toStoreType =
                packet.Data
                .ReadByte();         // [0 = adventure bag. 1 = character equipment], [then unknown byte], [then slot], [then unknown]
            byte  toBagId       = packet.Data.ReadByte();
            short fromSlot      = packet.Data.ReadInt16();
            byte  fromStoreType = packet.Data.ReadByte();
            byte  fromBagId     = packet.Data.ReadByte();
            short toSlot        = packet.Data.ReadInt16();

            Logger.Debug($"fromStoreType byte [{fromStoreType}]");
            Logger.Debug($"fromBagId byte [{fromBagId}]");
            Logger.Debug($"fromSlot byte [{fromSlot}]");
            Logger.Debug($"toStoreType byte [{toStoreType}]");
            Logger.Debug($"toBagId byte [{toBagId}]");
            Logger.Debug($"toSlot [{toSlot}]");

            int itemCount = packet.Data.ReadByte(); //last byte is stack count?

            Logger.Debug($"itemCount [{itemCount}]");
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0); //error check. 0 to work

            /*
             *  ITEMUSE	GENERIC	Unable to use this item right now
             *  ITEMUSE	-201	Store location is incorrect
             *  ITEMUSE	-204	Item amount is incorrect
             *  ITEMUSE	-205	The target to use this item is incorrect
             *  ITEMUSE	-206	Unable to use due to delay time
             *  ITEMUSE	-207	No space available in inventory
             *  ITEMUSE	-208	Unable to use this item since it is cursed
             *  ITEMUSE	-209	Unable to use this item since it is broken
             *  ITEMUSE	-210	You do not meet the requirements to equip this item
             *  ITEMUSE	-211	Unable to use this item
             *  ITEMUSE	-212	You are not in the right status to use this item
             *  ITEMUSE	-230	Unable to use since it is on cool down.
             *  ITEMUSE	-2601	You've already received this scrap
             *  ITEMUSE	-2708	Cannot be used outside of town
             *  ITEMUSE	-3001	Unable to move items when you have a shop open
             *
             */

            Router.Send(client, (ushort)AreaPacketId.recv_item_move_r, res, ServerType.Area);

            InventoryItem fromInvItem = client.Character.GetInventoryItem(fromStoreType, fromBagId, fromSlot);
            InventoryItem toInvItem   = client.Character.GetInventoryItem(toStoreType, toBagId, toSlot);

            if (toInvItem != null && (fromInvItem.StorageItem != toInvItem.StorageItem))
            {
                RecvNormalSystemMessage unlikeItems = new RecvNormalSystemMessage("You can only stack like items!");
                _server.Router.Send(unlikeItems, client);
                return;
            }

            if (toInvItem != null && (toInvItem.StorageCount >= 255))
            {
                RecvNormalSystemMessage unlikeItems =
                    new RecvNormalSystemMessage("The move would place too many items in destination slot!");
                _server.Router.Send(unlikeItems, client);
                return;
            }

            if (fromInvItem.StorageCount > 1)
            {
                if (client.Character.currentEvent != null)
                {
                    Logger.Error(
                        $"Trying to start new event with another outstanding event active! Outstanding event type [{client.Character.currentEvent.EventType}]");
                    client.Character.currentEvent = null;
                }

                MoveItem moveItem = _server.Instances.CreateInstance <MoveItem>();
                moveItem.toStoreType          = toStoreType;
                moveItem.toBagId              = toBagId;
                moveItem.toSlot               = toSlot;
                moveItem.fromStoreType        = fromStoreType;
                moveItem.fromBagId            = moveItem.fromBagId;
                moveItem.fromSlot             = fromSlot;
                moveItem.itemCount            = (byte)itemCount;
                moveItem.item                 = fromInvItem.StorageItem;
                client.Character.currentEvent = moveItem;
                RecvEventStart eventStart = new RecvEventStart(0, 0);
                Router.Send(eventStart, client);
                RecvEventRequestInt getCount = new RecvEventRequestInt("Select number to move.", 1,
                                                                       fromInvItem.StorageCount, fromInvItem.StorageCount);
                Router.Send(getCount, client);
            }
            else
            {
                if (toInvItem == null)
                {
                    fromInvItem.StorageType = toStoreType;
                    fromInvItem.StorageId   = toBagId;
                    fromInvItem.StorageSlot = toSlot;
                    client.Character.UpdateInventoryItem(fromInvItem);
                    RecvItemUpdatePlace changePlace =
                        new RecvItemUpdatePlace(fromInvItem.InstanceId, toStoreType, toBagId, toSlot);
                    _server.Router.Send(changePlace, client);
                    client.Character.UpdateInventoryItem(fromInvItem);
                }
                else
                {
                    toInvItem.StorageCount += 1;
                    RecvItemUpdateNum updateNum = new RecvItemUpdateNum(toInvItem.InstanceId, toInvItem.StorageCount);
                    _server.Router.Send(updateNum, client);
                    RecvItemRemove removeitem = new RecvItemRemove(fromInvItem.InstanceId);
                    _server.Router.Send(removeitem, client);
                    client.Character.UpdateInventoryItem(toInvItem);
                    client.Character.RemoveInventoryItem(fromInvItem);
                }
            }

            //SendItemPlace(client);
            //SendItemPlaceChange(client);
        }