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); }
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]) }); }
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); }