Exemple #1
0
        /// <summary>
        /// 添加物品
        /// </summary>
        /// <param name="account"></param>
        /// <param name="role"></param>
        /// <param name="sid"></param>
        /// <param name="bytes"></param>
        /// <returns></returns>
        private static async Task <BaseResponseData> AddItem()
        {
            try
            {
                AddItemResult result = new AddItemResult();
                if (User.bytes == null)
                {
                    result.Result = GameEnum.WsResult.ParamsError;
                    return(result);
                }
                var data = await InitHelpers.GetPse().DeserializeAsync <AddItemReq>(User.bytes);

                if (data == null)
                {
                    result.Result = GameEnum.WsResult.ParamsError;
                    return(result);
                }
                var id    = data.ItemId;
                var count = data.Count;
                return(await BagController.Instance.AddItemToRoleBag(id, count));
            }
            catch (Exception ex)
            {
                //日志
                throw ex;
            }
        }
Exemple #2
0
        public UnequipItemResult UnequipItem(byte sourceIndex, out byte index, out byte amount)
        {
            index  = 0;
            amount = 0;

            EQUIP_SLOT fromSlot = (EQUIP_SLOT)sourceIndex;

            // equip slot is not empty
            if (!this.equip.ContainsKey(fromSlot))
            {
                return(UnequipItemResult.ERROR);
            }

            // move the item into the inventory
            AddItemResult aRes = this.AddItem(this.equip[fromSlot], out index, out amount);

            if (aRes == AddItemResult.ERROR)
            {
                return(UnequipItemResult.ERROR);
            }

            // unequip the item
            this.equip.Remove(fromSlot);

            if (aRes == AddItemResult.NEW_INDEX)
            {
                return(UnequipItemResult.NEW_INDEX);
            }
            else if (aRes == AddItemResult.STACKED)
            {
                return(UnequipItemResult.STACKED);
            }

            return(UnequipItemResult.ERROR);
        }
Exemple #3
0
        public void OnAddItem(Item nItem, SagaDB.Items.ITEM_UPDATE_REASON reason)
        {
            byte          index, amount;
            AddItemResult res = I.inv.AddItem(nItem, out index, out amount);

            if (res == AddItemResult.ERROR)
            {
                Logger.ShowWarning("pc event handler: cannot add item with ID " + nItem.id, null);
                return;
            }

            nItem.index = index;
            nItem.stack = amount;

            if (res == AddItemResult.NEW_INDEX)
            {
                Packets.Server.AddItem p1 = new SagaMap.Packets.Server.AddItem();
                p1.SetContainer(CONTAINER_TYPE.INVENTORY);
                p1.SetItem(nItem);
                C.netIO.SendPacket(p1, C.SessionID);
                MapServer.charDB.NewItem(this.C.Char, nItem);
            }

            Packets.Server.UpdateItem p2 = new SagaMap.Packets.Server.UpdateItem();
            p2.SetContainer(CONTAINER_TYPE.INVENTORY);
            p2.SetItemIndex(nItem.index);
            p2.SetAmount(nItem.stack);
            p2.SetUpdateType(SagaMap.Packets.Server.ITEM_UPDATE_TYPE.AMOUNT);
            p2.SetUpdateReason(reason);
            C.netIO.SendPacket(p2, C.SessionID);
            MapServer.charDB.UpdateItem(this.C.Char, nItem);
        }
Exemple #4
0
        /// <summary>
        /// 添加道具进背包
        /// </summary>
        /// <param name="sm"></param>
        /// <param name="roleId"></param>
        /// <param name="itemId"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        public async Task <AddItemResult> AddItemToRoleBag(int itemId, long count)
        {
            var item = GetItemById(itemId);

            if (item == null)
            {
                return(null);
            }
            AddItemResult result = new AddItemResult();

            if (!CheckBagSpace(itemId, count))
            {
                result.Result = GameEnum.WsResult.NotEnoughBagSpace;
                return(result);
            }
            var itemCount = new Dictionary <int, long>();

            itemCount.Add(itemId, count);
            result = await AddItemToRoleBag(itemCount);

            var data = await InitHelpers.GetPse().SerializeAsync(result);

            await MsgMaker.SendMessage(WSResponseMsgID.AddItemResult, 1, data);    //写入队列

            return(result);
        }
Exemple #5
0
        public virtual AddItemResult AddItem(T item)
        {
            var result = new AddItemResult
            {
                Success = true
            };

            _items.AddOrUpdate(item.Id, item, (key, previousItem) =>
            {
                result.Success = false;
                result.Error   = $"Duplicate item found: {item.Id}. Newest item not added.";
                return(previousItem);
            });

            return(result);
        }
Exemple #6
0
        private void OnSubmit(object sender, RoutedEventArgs e)
        {
            if (CmbProducts.SelectedItem != null && _viewModel.Quantity > 0)
            {
                int qty;

                if (int.TryParse(TxtQty.Text, out qty))
                {
                    Result = new AddItemResult
                    {
                        Product  = CmbProducts.SelectedItem as Product,
                        Quantity = qty
                    };

                    DialogResult = true;
                    Close();
                }
            }
        }
Exemple #7
0
        /// <summary>
        /// 添加道具进用户背包
        /// </summary>
        /// <param name="sm"></param>
        /// <param name="roleId"></param>
        /// <param name="itemCount"></param>
        /// <returns></returns>
        private async Task <AddItemResult> AddItemToRoleBag(Dictionary <int, long> itemCount)
        {
            AddItemResult result          = new AddItemResult();
            var           roleInfo        = LogicServer.User.role;
            var           roleBg          = LogicServer.User.bag;
            long          oldSocialStatus = 0;

            foreach (var i in roleBg.Items)
            {
                var item = GetItemById(i.Key);
                if (item != null)
                {
                    checked
                    {
                        try
                        {
                            if (item.Superposition == 0)  //身价值不叠加
                            {
                                oldSocialStatus += item.Status;
                            }
                            else if (item.Superposition == 1)  //叠加
                            {
                                oldSocialStatus += (item.Status * i.Value.CurCount);
                            }
                        }
                        catch (OverflowException ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
            }
            long socialStatus = roleInfo.SocialStatus - oldSocialStatus; //除去背包中所有物品带来的身价值

            var curBagCell = roleBg.CurUsedCell;                         //当前背包所用格子

            foreach (var b in itemCount)
            {
                var itemTemplate = GetItemById(b.Key);
                var stackCount   = (itemTemplate.Count == 0 ? 1 : itemTemplate.Count);
                checked
                {
                    try
                    {
                        if (roleBg.Items.TryGetValue(b.Key, out Model.Data.General.Item value)) //存在
                        {
                            curBagCell -= value.OnSpace;                                        //去除原先占用的格子
                            if (stackCount == 1)
                            {
                                value.OnSpace = value.CurCount += b.Value;  //当前数量和空间
                            }
                            else
                            {
                                value.CurCount += b.Value;    //当前数量
                                value.OnSpace   = (value.CurCount / stackCount) + 1;
                            }
                            curBagCell += value.OnSpace;  //更新加入物品后的格子
                        }
                        else
                        {
                            Model.Data.General.Item i = new Model.Data.General.Item();
                            if (stackCount == 1)
                            {
                                i.OnSpace = i.CurCount = b.Value;   //当前数量和空间
                            }
                            else
                            {
                                i.CurCount += b.Value;
                                i.OnSpace   = (i.CurCount / stackCount) + 1;
                            }
                            curBagCell += i.OnSpace;  //更新加入物品后的格子
                            roleBg.Items.Add(b.Key, i);
                        }
                    }
                    catch (OverflowException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
            }
            roleBg.CurUsedCell = curBagCell;

            await BagDataHelper.Instance.UpdateBagByRoleId(roleBg, LogicServer.User.role.Id);

            foreach (var status in roleBg.Items)
            {
                var item = GetItemById(status.Key);
                if (item != null)
                {
                    checked
                    {
                        try
                        {
                            if (item.Superposition == 0)
                            {
                                socialStatus += item.Status;
                            }
                            else
                            {
                                socialStatus += (item.Status * status.Value.CurCount);
                            }
                        }
                        catch (OverflowException ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
            }

            roleInfo.SocialStatus = socialStatus;                                         //身价值更新
            await RoleDataHelper.Instance.UpdateRoleByRoleIdAsync(roleInfo.Id, roleInfo); //保存



            result.ShenJia             = socialStatus;
            result.BagInfo.CurUsedCell = roleBg.CurUsedCell;
            foreach (var i in roleBg.Items)
            {
                result.BagInfo.Items.Add(i.Key, new LoadRoleBagInfo()
                {
                    OnSpace  = i.Value.OnSpace,
                    CurCount = i.Value.CurCount,
                });
            }
            return(result);
        }
        public override AddItemResult AddItem(Product item)
        {
            var result = new AddItemResult
            {
                Success = true
            };

            if (!string.IsNullOrWhiteSpace(item.ParentId))
            {
                if (_items.ContainsKey(item.ParentId))
                {
                    var parentProduct = _items[item.ParentId];

                    if (parentProduct.Variants.All((var) => { return(var.Id != item.Id); }))
                    {
                        parentProduct.Variants.Add(item);
                        _items.AddOrUpdate(parentProduct.Id, parentProduct, (key, previousItem) =>
                        {
                            return(parentProduct);
                        });
                    }
                    else
                    {
                        result.Success = false;
                        result.Error   = $"Duplicate item found: {item.Id}. Newest item not added.";
                    }
                }
                else if (_variantsAwaitingParents.ContainsKey(item.ParentId))
                {
                    var existingList = _variantsAwaitingParents[item.ParentId];

                    if (existingList.All((var) => { return(var.Id != item.Id); }))
                    {
                        existingList.Add(item);
                        _variantsAwaitingParents.AddOrUpdate(item.ParentId, existingList, (key, previousItem) =>
                        {
                            return(existingList);
                        });
                    }
                    else
                    {
                        result.Success = false;
                        result.Error   = $"Duplicate item found: {item.Id}. Newest item not added.";
                    }
                }
                else
                {
                    _variantsAwaitingParents.AddOrUpdate(item.ParentId, new List <Product> {
                        item
                    }, (key, previousItem) =>
                    {
                        result.Success = false;
                        result.Error   = $"Duplicate item found: {item.Id}. Newest item not added.";
                        return(previousItem);
                    });
                }
            }
            else
            {
                if (_variantsAwaitingParents.ContainsKey(item.Id))
                {
                    item.Variants.AddRange(_variantsAwaitingParents[item.Id]);
                    var removedVariants = new List <Product>();
                    _variantsAwaitingParents.TryRemove(item.Id, out removedVariants);
                }

                _items.AddOrUpdate(item.Id, item, (key, previousItem) =>
                {
                    result.Success = false;
                    result.Error   = $"Duplicate item found: {item.Id}. Newest item not added.";
                    return(previousItem);
                });
            }

            return(result);
        }