private async ETTask RunAsync(Player player, C2L_UpdateUserEquip message, Action <L2C_UpdateUserEquip> reply) { L2C_UpdateUserEquip response = new L2C_UpdateUserEquip(); try { long uid = player.uid; if (uid <= 0) { //未被Gate授權的帳戶 response.Error = ErrorCode.ERR_ConnectGateKeyError; } else { User user = await UserDataHelper.FindOneUser(uid); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; } else { // 蒐集Log資訊(可一致性,但複雜) var log = new BsonDocument(); if (user.playerCharSetting.CharacterId != message.CharSetting.CharacterId) { log["characterId"] = message.CharSetting.CharacterId; } if (user.playerCharSetting.BicycleId != message.CharSetting.BicycleId) { log["bicycleId"] = message.CharSetting.BicycleId; } if (user.playerCharSetting.BodyId != message.CharSetting.BodyId) { log["bodyId"] = message.CharSetting.BodyId; } if (user.playerCharSetting.DecorationId != message.CharSetting.DecorationId) { log["decorationId"] = message.CharSetting.DecorationId; } if (user.playerCharSetting.MedalId != message.CharSetting.MedalId) { log["medalId"] = message.CharSetting.MedalId; } user.playerCharSetting = message.CharSetting; await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserCharacterSetting, log); response.Error = ErrorCode.ERR_Success; } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
private static async void SaveUserAndBroadcastTarget(MapUnit mapUnit, User user, BsonDocument log) { await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserRideTotalRecord, log); // 如果玩家在線上 告知該玩家異動紀錄 var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); Player selfPlayer = playerSync.Get <Player>(mapUnit.Uid); if (selfPlayer != null) { PlayerRideTotalInfo playerRideTotalInfo = await UserDataHelper.QueryUserRideAllRecord(user); G2C_UpdatePlayerRideTotalInfo g2c_UpdatePlayerRideInfo = new G2C_UpdatePlayerRideTotalInfo() { TotalInfo = playerRideTotalInfo, }; GateMessageHelper.BroadcastTarget(g2c_UpdatePlayerRideInfo, mapUnit.Uid); } }
private async ETTask RunAsync(Player player, C2L_UpdateUserLanguage message, Action <L2C_UpdateUserLanguage> reply) { L2C_UpdateUserLanguage response = new L2C_UpdateUserLanguage(); try { long uid = player.uid; if (uid <= 0) { //未被Gate授權的帳戶 response.Error = ErrorCode.ERR_ConnectGateKeyError; } else { User user = await UserDataHelper.FindOneUser(uid); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; } else { var log = new BsonDocument(); if (user.language != message.Language) { log["language"] = message.Language; user.language = message.Language; } await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserLanguage, log); response.Error = ErrorCode.ERR_Success; } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
private async static ETTask SignInByUid(Session session, User user, R2C_Authentication response, string firebaseDeviceToken, bool isRefreshToken, string signInMethod) { BsonDocument log = new BsonDocument(); // 更新user登入資訊 user.lastOnlineAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); log["lastOnlineAt"] = user.lastOnlineAt; // 最後登入時間 log["signInMethod"] = signInMethod; // 登入方式 if (user.firebaseDeviceToken != firebaseDeviceToken) { user.firebaseDeviceToken = firebaseDeviceToken; log["firebaseDeviceToken"] = user.firebaseDeviceToken; // 最後更新的FirebaseToken } if (isRefreshToken) { user.lastCreateTokenAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); log["lastCreateTokenAt"] = user.lastCreateTokenAt; // 最後更新Token的時間 } log["ip"] = session.RemoteAddress.ToString(); // 登入位址 await UserDataHelper.UpsertUser(user, DBLog.LogType.SignUserIn, log); // 從Realm轉登到Gate並傳給Client用戶資料 await RealmToGate(session, user, response, isRefreshToken); }
private async ETTask RunAsync(Player player, C2L_UpdateUserProfile message, Action <L2C_UpdateUserProfile> reply) { L2C_UpdateUserProfile response = new L2C_UpdateUserProfile(); try { long uid = player.uid; if (uid <= 0) { //未被Gate授權的帳戶 response.Error = ErrorCode.ERR_ConnectGateKeyError; } else { User user = await UserDataHelper.FindOneUser(uid); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; } else { var log = new BsonDocument(); if (user.name != message.Name) { log["name"] = message.Name; user.name = message.Name; } if (user.gender != message.Sex) { log["gender"] = message.Sex; user.gender = message.Sex; } if (user.location != message.Location) { log["location"] = message.Location; user.location = message.Location; } if (user.height != message.Height) { log["height"] = message.Height; user.height = message.Height; } if (user.weight != message.Weight) { log["weight"] = message.Weight; user.weight = message.Weight; } if (user.birthday != message.Birthday) { log["birthday"] = message.Birthday; user.birthday = message.Birthday; } await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserProfiler, log); response.Error = ErrorCode.ERR_Success; } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
/// <summary> /// 重新計算背包數 /// </summary> /// <param name="user"></param> /// <param name="equipmentTypes"></param> /// <returns></returns> private static async ETTask RecalculateBagCount(this User user, List <int> equipmentTypes) { var userBagCapacity = user.userBagCapacity; var results = await dbProxy.Query <Equipment>(entity => entity.uid == user.Id && equipmentTypes.Contains(entity.configType)); var dict = OtherHelper.Group(results.OfType <Equipment>().ToList(), entity => entity.configType); var logBag = new BsonDocument(); var logCharSetting = new BsonDocument(); var isDecorationExisted = false; for (int a = 0; a < equipmentTypes.Count; a++) { var type = equipmentTypes[a]; var equipmentType = (Equipment.EquipmentType)type; if (!dict.TryGetValue(type, out var equipments)) { equipments = new List <Equipment>(0); } // 初始化 int usedCount = 0; var usedCountString = GetUsedCountString(equipmentType); for (int i = 0; i < equipments.Count; i++) { var equipment = equipments[i]; if (TryGetEquipmentConfig(equipment.configId, out CharacterConfig characterConfig)) { // 不可疊直接++ if (!characterConfig.IsStackEquipment()) { // 現在的不可疊裝備至少有一件符合(TODO:能裝備的裝備一定要不可疊) // TODO:腳色裝備的記錄改用裝備的_id if (equipment.configId == user.playerCharSetting.DecorationId) { isDecorationExisted = true; } usedCount++; } else { if (characterConfig.MaxCountOnSlot < 0) { usedCount++; } else { var remainder = equipment.count % characterConfig.MaxCountOnSlot; var slotCount = equipment.count / characterConfig.MaxCountOnSlot + (remainder == 0 ? 0 : 1); usedCount += slotCount; } } } else { Log.Error($"Equipment config id:{equipment.configId} is not defined!"); continue; } } if (userBagCapacity[usedCountString] != usedCount) { logBag[usedCountString] = usedCount; userBagCapacity[usedCountString] = usedCount; } } if (!isDecorationExisted) { user.playerCharSetting.DecorationId = 0; } await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserBagSlotCount, logBag); }