Example #1
0
        /// <summary>
        /// 换装
        /// </summary>
        /// <param name="account"></param>
        /// <param name="role"></param>
        /// <param name="sid"></param>
        /// <param name="bytes">时装id数组</param>
        /// <returns></returns>
        private static async Task <BaseResponseData> ChangeAvater()
        {
            ChangeAvatarResult result = new ChangeAvatarResult();

            if (User.bytes == null)
            {
                result.Result = GameEnum.WsResult.ParamsError;
                return(result);
            }
            var data = await InitHelpers.GetPse().DeserializeAsync <ChangeAvatarReq>(User.bytes);

            if (data == null)
            {
                result.Result = GameEnum.WsResult.ParamsError;
                return(result);
            }
            var id = data.Id;

            return(await BagController.Instance.ChangeAvatar(id, result));
        }
Example #2
0
        public async Task <ChangeAvatarResult> ChangeAvatar(int[] id, ChangeAvatarResult result)
        {
            var role = LogicServer.User.role;

            #region 检查时装部位
            var        parts     = GetAvatarParts(role.Avatar);
            List <int> oldAvatar = new List <int>();  //换下来的时装id
            #endregion

            foreach (var i in id)
            {
                if (!(CheckItemInBag(i, 1)))
                {
                    result.Result = GameEnum.WsResult.NotItemInBag; return(result);
                }
                var tmp = GetForId(i);
                if (tmp == null)
                {
                    result.Result = GameEnum.WsResult.NotItemConfig; return(result);
                }
                oldAvatar.AddRange(GetOldAvatarItemId(parts, tmp.Parts));
                foreach (var j in tmp.Attribute)    //增加属性
                {
                    var attr = role.UserAttr.First(a => a.UserAttrID == j.AttributeID);
                    checked
                    {
                        try
                        {
                            attr.Count += j.Count;
                        }
                        catch (OverflowException ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
            }
            foreach (var i in oldAvatar.Distinct())   //移除旧的属性
            {
                var tmp = GetForId(i);
                foreach (var item in tmp.Attribute)
                {
                    var attr = role.UserAttr.First(a => a.UserAttrID == item.AttributeID);
                    checked
                    {
                        try
                        {
                            attr.Count -= item.Count;
                        }
                        catch (OverflowException ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
            }
            //检查背包剩余空间是否可以存放卸下来的时装
            foreach (var oldItem in oldAvatar)
            {
                if (!CheckBagSpace(oldItem, 1))
                {
                    result.Result = GameEnum.WsResult.NotEnoughBagSpace;
                    return(result);
                }
            }

            RoleDataHelper.Instance.UpdateRoleByRoleIdAsync(role.Id, role).Wait();


            //移除背包中的时装
            foreach (var item in id)
            {
                await RemoveItemsAsync(item, 1);
            }
            foreach (var item in oldAvatar)
            {
                await AddItemToRoleBag(item, 1);  //增加旧时装到背包中
            }
            //更换时装到身上
            await UpdateAvaterAsync(id, parts);

            ///构造返回


            foreach (var art in role.UserAttr)
            {
                result.ChangeAttr.Add(new Model.ResponseData.UserAttr()
                {
                    Count      = art.Count,
                    UserAttrID = art.UserAttrID
                });
            }

            result.BagInfo.CurUsedCell   = LogicServer.User.bag.CurUsedCell;
            result.BagInfo.MaxCellNumber = LogicServer.User.bag.MaxCellNumber;
            foreach (var item in LogicServer.User.bag.Items)
            {
                result.BagInfo.Items.Add(item.Key, new LoadRoleBagInfo()
                {
                    CurCount = item.Value.CurCount,
                    OnSpace  = item.Value.OnSpace
                });
            }
            return(result);
        }