public static async Task <(ErrorCode, Goods, CharacterInfo)> UpgradePowerLevel(Session session, int character_id)
        {
            var character_data = ACDC.CharacterData[character_id];

            if (character_data == null || character_data == default(JCharacterData))
            {
                Log.Information($"UpgradePowerLevel cannot find character_id:{character_id}, user_name:{session.user_name}");
                return(ErrorCode.WrongParam, null, null);
            }

            var           level_table    = character_data.LevelTable;
            var           goods          = new Goods();
            CharacterInfo character_info = null;

            await using (var mylock = await RedLock.CreateLockAsync($"lock:session:{session.session_id}"))
            {
                await using (var user = await UserCache.GetUser(session.member_no, session.user_no, true, true, false))
                    await using (var character = await CharacterCache.Instance.GetEntity(session.member_no, session.user_no, character_id, true, true, false))
                    {
                        if (character == null || character == default(Models.Character))
                        {
                            Log.Information($"UpgradePowerLevel cannot find character_id:{character_id}, user_name:{session.user_name}");
                            return(ErrorCode.WrongParam, null, null);
                        }

                        JPowerLevel_TableData power_level_data;
                        if (level_table.TryGetValue(character.character_level, out power_level_data) == false)
                        {
                            return(ErrorCode.OverLimit, null, null);
                        }

                        if (character.piece < power_level_data.Req_Piece)
                        {
                            return(ErrorCode.NotEnough, null, null);
                        }

                        if (Inventory.UseGoods(session, user, power_level_data.Pricetype, power_level_data.Req_PriceValue, new LogReason("S_UPGRADE_SMASHER", character_id.ToString())) == false)
                        {
                            return(ErrorCode.NotEnough, null, null);
                        }

                        character.piece           -= power_level_data.Req_Piece;
                        character.character_level += 1;
                        character.IsDirty          = true;

                        goods.Set(user);

                        character_info = CharacterManager.CreateCharacterInfo(character, character_data);

                        var game_item_data = ACDC.GameItemData.Values.Where(x => x.Item_Type == (int)GameItemType.CharacterPiece && x.LinkId == character_id).FirstOrDefault();
                        var item_id        = game_item_data.id;
                        var item_count     = power_level_data.Req_Piece;
                        _ = LogProxy.writeItemLog(session, game_item_data.Item_Type.ToString(), item_id.ToString(), "y", "", item_count, "", 0, 0, "add", "S_UPGRADE_SMASHER", character_id.ToString(), "").ConfigureAwait(false);
                        _ = LogProxy.writeActionLog(session, "캐릭터", "업그레이드", character.character_type.ToString()).ConfigureAwait(false);

                        History.Info(session.member_no, session.user_no, session.character_no, HistoryLogAction.UseItem, (byte)HistoryLogReason.UpgradePowerLevel, item_id, item_count, "", "");
                    }
            }
            return(ErrorCode.Success, goods, character_info);
        }
Exemplo n.º 2
0
        public override async Task SelectFirstCharacter(SelectFirstCharacterRequest request, IServerStreamWriter <SelectFirstCharacterReply> responseStream, ServerCallContext context)
        {
            var session = await context.GetSession();

            var user = await UserCache.GetUser(session.member_no, session.user_no, false);

            if (session == null || user == null)
            {
                await responseStream.WriteAsync(new SelectFirstCharacterReply()
                {
                    Code = ErrorCode.LostSession
                });

                return;
            }

            if (session.character_no != 0 || user.character_no != 0)
            {
                await responseStream.WriteAsync(new SelectFirstCharacterReply()
                {
                    Code = ErrorCode.NotAvailable
                });

                return;
            }

            if (!ACDC.CharacterSelectData[1].CharacterId.Contains(request.CharacterId))
            {
                await responseStream.WriteAsync(new SelectFirstCharacterReply()
                {
                    Code = ErrorCode.WrongParam
                });

                return;
            }

            var character = await CharacterManager.InsertCharacter(session.member_no, session.user_no, session.user_name, session.player_id, request.CharacterId);

            if (character == null)
            {
                await responseStream.WriteAsync(new SelectFirstCharacterReply()
                {
                    Code = ErrorCode.NotAvailable
                });

                return;
            }
            await UserCache.UpdateUserLock(session, session.user_no, character.character_no);

            await Session.UpdateSessionLock(session.session_id, delegate(Session s) { s.character_no = character.character_no; });

            History.Info(session.member_no, session.user_no, session.character_no, HistoryLogAction.GainItem, (byte)HistoryLogReason.SelectCharacter, character.character_type, 1, "", "");
            _ = LogProxy.writeActionLog(session, "캐릭터", "최초획득", character.character_type.ToString()).ConfigureAwait(false);

            await responseStream.WriteAsync(new SelectFirstCharacterReply()
            {
                Code = ErrorCode.Success, CharacterInfo = CharacterManager.CreateCharacterInfo(character, ACDC.CharacterData[character.character_type])
            });
        }
Exemplo n.º 3
0
        public static async Task Load(this UserInfo userInfo, Session session)
        {
            long user_no = session.user_no;

            userInfo.AccountGoods = new Goods();
            var user = await UserCache.GetUser(session.member_no, user_no, true);

            int characterId = 0;
            var characters  = await CharacterCache.Instance.GetEntities(session.member_no, user_no, true);

            if (characters != null)
            {
                // 선택된 케릭터가 없다면 첫번째 케릭터로 내려줌
                if (characters.Count > 0)
                {
                    characterId = characters[0].character_type;
                }

                foreach (var character in characters)
                {
                    var character_data = ACDC.CharacterData[character.character_type];

                    userInfo.CharacterList.Add(CharacterManager.CreateCharacterInfo(character, character_data));

                    if (user.character_no == character.character_no)
                    {
                        characterId = character.character_type;
                    }
                }
            }

            //userInfo.UserName = user.user_name ?? "";
            userInfo.UserName            = session.user_name ?? "";
            userInfo.AccountBattleScore  = user.battle_score;
            userInfo.SelectedCharacterId = characterId;
            userInfo.SelectedMapId       = session.map_id;
            userInfo.AccountGoods.Set(user);
        }