/// <summary> /// 建立關係申請 /// </summary> /// <param name="uid"></param> /// <param name="targetUid"></param> /// <returns></returns> public static async ETTask <RelationshipApply> AddRelationshipApply(long senderUid, long receiverUid) { bool exist = await ExistRelationshipApply(senderUid, receiverUid); if (exist) { return(null); } var relationshipApply = ComponentFactory.CreateWithId <RelationshipApply>(IdGenerater.GenerateId()); relationshipApply.applyId = relationshipApply.Id; var senderUser = await UserDataHelper.FindOneUser(senderUid); relationshipApply.senderUid = senderUid; relationshipApply.senderName = senderUser.name; relationshipApply.senderLocation = senderUser.location; relationshipApply.senderMileage = senderUser.playerRideTotalInfo.Mileage; var receiverUser = await UserDataHelper.FindOneUser(receiverUid); relationshipApply.receiverUid = receiverUid; relationshipApply.receiverName = receiverUser.name; relationshipApply.receiverLocation = receiverUser.location; relationshipApply.receiverMileage = receiverUser.playerRideTotalInfo.Mileage; await dbProxy.Save(relationshipApply); await dbProxy.SaveLog(senderUid, DBLog.LogType.RelationshipApply, relationshipApply); return(relationshipApply); }
protected async ETTask RunAsync(MapUnit mapUnit, C2M_GiveEmoticon message) { await ETTask.CompletedTask; try { M2C_GiveEmoticon m2C_GiveEmoticon = new M2C_GiveEmoticon(); if (mapUnit.Id == message.MapUnitId) { Log.Error("給自己按讚是不行的!"); return; } MapUnit target = mapUnit.Room.GetMapUnitById(message.MapUnitId); User user = await UserDataHelper.FindOneUser(mapUnit.Uid); m2C_GiveEmoticon.Name = user?.name; m2C_GiveEmoticon.EmoticonIndex = message.EmoticonIndex; MapMessageHelper.BroadcastTarget(m2C_GiveEmoticon, new List <MapUnit> { target }); } catch (Exception e) { Log.Error(e); } }
protected async ETTask RunAsync(MapUnit mapUnit, C2M_GiveAisatsu message) { await ETTask.CompletedTask; try { M2C_GiveAisatsu m2C_GiveAisatsu = new M2C_GiveAisatsu(); if (mapUnit.Id == message.MapUnitId) { Log.Error("µ¹¦Û¤v«öÆg¬O¤£¦æªº!"); return; } MapUnit target = mapUnit.Room.GetMapUnitById(message.MapUnitId); User user = await UserDataHelper.FindOneUser(mapUnit.Uid); m2C_GiveAisatsu.Name = user?.name; m2C_GiveAisatsu.Content = message.Content; MapMessageHelper.BroadcastTarget(m2C_GiveAisatsu, new List <MapUnit> { target }); } catch (Exception e) { Log.Error(e); } }
public static async void SaveRoadAllInfo(MapUnit mapUnit, long teamId, bool saveRideRoadInfos = true, bool saveRideTotalInfos = true) { if (mapUnit == null) { Log.Error("SaveRoadAllInfo Failed, mapUnit == null"); return; } if (mapUnit.MapUnitType == MapUnitType.Npc) { return; } var roadInfo = mapUnit.CreateRideRecord(teamId); var roadTotalInfo = mapUnit.CreateRideTotalInfo(); var user = await UserDataHelper.FindOneUser(mapUnit.Uid); BsonDocument log = null; if (saveRideRoadInfos) { SaveRideRoadInfos(roadInfo); } if (saveRideTotalInfos) { SaveRideTotalInfo(user, roadTotalInfo, out log); } SaveUserAndBroadcastTarget(mapUnit, user, log); }
protected async ETTask RunAsync(Session session, C2G_TeamInviteRefuse message, Action <G2C_TeamInviteRefuse> reply) { G2C_TeamInviteRefuse response = new G2C_TeamInviteRefuse(); try { //取得自身資料 Player player = session.GetComponent <SessionPlayerComponent>().Player; User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } //判斷邀請是否合法 var inviteComponent = Game.Scene.GetComponent <InviteComponent>(); var invite = inviteComponent.GetByInviteId(message.InviteId); if (invite == null) { response.Error = ErrorCode.ERR_InviteIdNotFind; reply(response); return; } if (invite.data.ReceiverUid != player?.uid) { response.Error = ErrorCode.ERR_InviteNotSelf; reply(response); return; } //告知對方拒絕邀請 var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); Player senderTarget = playerSync.Get <Player>(invite.data.SenderUid); if (senderTarget != null) { G2C_TeamInviteTargerRefuse g2c_TeamInviteTargerRefuse = new G2C_TeamInviteTargerRefuse(); g2c_TeamInviteTargerRefuse.RefuseUid = player.uid; GateMessageHelper.BroadcastTarget(g2c_TeamInviteTargerRefuse, invite.data.SenderUid); } //刪除該邀請 await inviteComponent.DestroyByInviteId(message.InviteId); //回傳資料 response.Error = ErrorCode.ERR_Success; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
private async ETTask RunAsync(Player player, C2L_AddRelationship message, Action <L2C_AddRelationship> reply) { L2C_AddRelationship response = new L2C_AddRelationship(); try { long uid = player.uid; //Apply var relationshipApply = await RelationshipDataHelper.AddRelationshipApply(uid, message.Uid); if (relationshipApply == null) { response.Error = ErrorCode.ERR_RelationshipApplyInfo_AddFailed; reply(response); return; } response.Error = ErrorCode.ERR_Success; reply(response); // 確認玩家是在線,在線的話傳送好友資訊 var relationshipApplyInfo = RelationshipApply.ConvertToRelationshipApplyInfo(relationshipApply); var uidUser = await UserDataHelper.FindOneUser(uid); var receiverUidUser = await UserDataHelper.FindOneUser(message.Uid); var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); Player target = playerSync.Get <Player>(message.Uid); if (target != null) { var notifyRelationshipState_SenderNotRequested = new L2C_NotifyRelationshipApplyState() { AddApplyInfo = relationshipApplyInfo, IsRequested = false, }; GateMessageHelper.BroadcastTarget(notifyRelationshipState_SenderNotRequested, message.Uid); } //傳給自己更新Apply列表 var notifyRelationshipState_SenderIsRequested = new L2C_NotifyRelationshipApplyState() { AddApplyInfo = relationshipApplyInfo, IsRequested = true, }; GateMessageHelper.BroadcastTarget(notifyRelationshipState_SenderIsRequested, uid); // 推播告知receiverUser var firebase = Game.Scene.GetComponent <FirebaseComponent>(); var lang = Game.Scene.GetComponent <LanguageComponent>(); // 7 = {0}向你發出好友邀請! var body = lang.GetString(receiverUidUser.language, 7); await firebase.SendOneNotification(receiverUidUser.firebaseDeviceToken, string.Empty, string.Format(body, uidUser.name)); } catch (Exception e) { ReplyError(response, e, reply); } }
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); } }
public async static ETTask LinkByFaceBook(Player player, LinkInfo info, L2C_Link response) { string fbToken = info.Secret; bool isValidToken = await FacebookHelper.ValidateFacebookToken(fbToken); if (!isValidToken) { response.Error = ErrorCode.ERR_LinkFailed; return; } ThirdPartyInfo fbInfo = await FacebookHelper.GetFacebookUserInfo(fbToken); if (fbInfo == null) { response.Error = ErrorCode.ERR_LinkFailed; return; } long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); ThirdPartyUser thirdPartyUser = await UserDataHelper.FindOneThirdPartyUser(fbInfo.id, UserDataHelper.tagFB); if (thirdPartyUser == null) { long uid = player.uid; User user = await UserDataHelper.FindOneUser(uid); if (user == null) { response.Error = ErrorCode.ERR_LinkFailed; return; } //綁定第三方-FB thirdPartyUser = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId()); thirdPartyUser.uid = user.Id; thirdPartyUser.party = UserDataHelper.tagFB; thirdPartyUser.userId = fbInfo.id; thirdPartyUser.gender = fbInfo.gender; thirdPartyUser.location = fbInfo.location; thirdPartyUser.email = fbInfo.email; thirdPartyUser.name = fbInfo.name; thirdPartyUser.birthday = fbInfo.birthday; thirdPartyUser.createAt = now; await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser); //取得新的第三方列表 response.LinkTypes.Clear(); response.LinkTypes.AddRange(await GetAllLinkType(user.Id)); } else { response.Error = ErrorCode.ERR_LinkIsExist; } }
private async ETTask RunAsync(Player player, C2L_TeamReservationCancel message, Action <L2C_TeamReservationCancel> reply) { L2C_TeamReservationCancel response = new L2C_TeamReservationCancel(); try { User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } //判斷是否為發起人 var reservationComponent = Game.Scene.GetComponent <ReservationComponent>(); var reservation = reservationComponent.GetByReservationId(message.ReservationId); if (reservation.allData.SenderUid != player.uid) { response.Error = ErrorCode.ERR_ReservationIsNotLeader; reply(response); return; } if (reservation.room != null) { if (reservation.room.State != RoomState.Ready && reservation.room.State != RoomState.Start) { response.Error = ErrorCode.ERR_ReservationRoomStateCanNotToRemove; reply(response); return; } else { var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>(); // 告知失去房間訊息 await lobbyComponent.BroadcastTeamLose(reservation.room.Id); } } //刪除預約實體(DB會一起刪除) await reservationComponent.DestroyReservation(message.ReservationId); //回傳資料 response.Error = ErrorCode.ERR_Success; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
private async void CreateRoomAsync(Reservation self) { var roomInfo = new RoomInfo() { RoomId = 0, Title = self.allData.SenderName, RoadSettingId = self.allData.RoadSettingId, MaxMemberCount = 8, NowMemberCount = 0, }; var teamRoomData = new TeamRoomData() { LeaderUid = -1, LeaderName = self.allData.SenderName, StartUTCTimeTick = self.allData.StartUTCTimeTick, IsReservation = true, }; var reservationMembers = new RepeatedField <ReservationMemberData>(); for (int i = 0; i < self.allData.MemberUid?.count; i++) { var uid = self.allData.MemberUid[i]; User user = await UserDataHelper.FindOneUser(uid); if (user == null) { Log.Error($"Reservation CreateRoomAsync Failed, Can't find user, uid:{uid}"); continue; } var reservationMemberData = new ReservationMemberData() { MemberIndex = i, Uid = user.Id, Name = user.name, Location = user.location, }; reservationMembers.Add(reservationMemberData); } var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>(); // 隨機一個Map給要預約的房間 var startConfig = NetworkHelper.GetRandomMap(); self.room = await lobbyComponent.CreateTeamRoom(startConfig.AppId, roomInfo, teamRoomData); var reservationComponent = Game.Scene.GetComponent <ReservationComponent>(); await reservationComponent.UpdateReservation(self); await lobbyComponent.SetReservationMember(self.room.Id, reservationMembers); }
protected async ETTask RunAsync(Session session, C2G_TeamInviteRefuseAll message, Action <G2C_TeamInviteRefuseAll> reply) { G2C_TeamInviteRefuseAll response = new G2C_TeamInviteRefuseAll(); try { //取得自身資料 Player player = session.GetComponent <SessionPlayerComponent>().Player; User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } var inviteComponent = Game.Scene.GetComponent <InviteComponent>(); var inviteList = inviteComponent.GetByUid(player.uid); var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); for (int i = 0; i < inviteList.Count; i++) { //告知對方拒絕邀請 Player senderTarget = playerSync.Get <Player>(inviteList[i].data.SenderUid); if (senderTarget != null) { G2C_TeamInviteTargerRefuse g2c_TeamInviteTargerRefuse = new G2C_TeamInviteTargerRefuse(); g2c_TeamInviteTargerRefuse.RefuseUid = player.uid; GateMessageHelper.BroadcastTarget(g2c_TeamInviteTargerRefuse, inviteList[i].data.SenderUid); } } //刪除自身全部邀請 await inviteComponent.DestroyByUid(player.uid); //回傳資料 response.Error = ErrorCode.ERR_Success; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
public async static ETTask LinkByAppleId(Player player, LinkInfo info, L2C_Link response) { string appleId = CryptographyHelper.AESDecrypt(info.Secret); ThirdPartyInfo appleInfo = new ThirdPartyInfo { id = appleId, }; long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); ThirdPartyUser thirdPartyUser = await UserDataHelper.FindOneThirdPartyUser(appleInfo.id, UserDataHelper.tagAppleId); if (thirdPartyUser == null) { long uid = player.uid; User user = await UserDataHelper.FindOneUser(uid); if (user == null) { response.Error = ErrorCode.ERR_LinkFailed; return; } // 綁定第三方-Apple thirdPartyUser = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId()); thirdPartyUser.uid = user.Id; thirdPartyUser.party = UserDataHelper.tagAppleId; thirdPartyUser.userId = appleInfo.id; thirdPartyUser.gender = appleInfo.gender; thirdPartyUser.location = appleInfo.location; thirdPartyUser.email = appleInfo.email; thirdPartyUser.name = appleInfo.name; thirdPartyUser.birthday = appleInfo.birthday; thirdPartyUser.createAt = now; await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser); // 取得新的第三方列表 response.LinkTypes.Clear(); response.LinkTypes.AddRange(await GetAllLinkType(user.Id)); } else { response.Error = ErrorCode.ERR_LinkIsExist; } }
public async override void Run(long messageId) { StartConfig startConfig = Game.Scene.GetComponent <StartConfigComponent>().StartConfig; if (!appTypes.Contains(startConfig.AppType)) { Log.Warning($"not supported server type on event: {typeof(Event_MessageTip).Name}!"); return; } var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); var messageTipSetting = Game.Scene.GetComponent <ConfigComponent>().Get(typeof(MessageTipSetting), messageId) as MessageTipSetting; if (messageTipSetting != null) { foreach (var playerData in playerSync.Data) { var uid = playerData.Key; var user = await UserDataHelper.FindOneUser(uid); var tipContent = string.Empty; switch (user.language) { //SystemLanguage.English default: case 10: tipContent = messageTipSetting.en_context; break; //SystemLanguage.ChineseTraditional case 41: tipContent = messageTipSetting.zh_tw_context; break; } GateMessageHelper.BroadcastTarget(new G2C_MessageTip() { TipContent = tipContent }, 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); } }
public async static ETTask AuthenticationByToken(Session session, AuthenticationInfo info, R2C_Authentication response) { SignInCryptographyHelper.Token tok = null; try { tok = SignInCryptographyHelper.DecodeToken(info.Secret); if (tok == null) { response.Error = ErrorCode.ERR_InvalidToken; return; } } catch (Exception e) { response.Error = ErrorCode.ERR_InvalidToken; return; } User user = await UserDataHelper.FindOneUser(tok.uid); if (user != null) { if (user.salt != tok.salt || user.lastCreateTokenAt != tok.lastCreateTokenAt) { response.Error = ErrorCode.ERR_InvalidToken; } else { await SignInByUid(session, user, response, info.FirebaseDeviceToken, false, UserDataHelper.tagToken); } } else { response.Error = ErrorCode.ERR_AccountDoesntExist; } }
protected override async ETTask Run(MapUnit mapUnit, C2M_TeamInvite message, Action <M2C_TeamInvite> reply) { await ETTask.CompletedTask; M2C_TeamInvite response = new M2C_TeamInvite(); try { if (mapUnit.Room == null) { response.Error = ErrorCode.ERR_RoomIdNotFound; reply(response); return; } if (mapUnit.Room.Type != RoomType.Team) { response.Error = ErrorCode.ERR_RoonTypeError; reply(response); return; } if (mapUnit.Room.State != RoomState.Start) { response.Error = ErrorCode.ERR_RoomTeamStateCanNotInvite; reply(response); return; } User user = await UserDataHelper.FindOneUser(mapUnit.Uid); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } // 建立邀請 InviteData inviteData = new InviteData() { SenderName = user.name, SenderUid = mapUnit.Uid, ReceiverUid = message.ReceiverUid, TeamRoomId = mapUnit.Room.Id, RoadSettingId = mapUnit.Room.info.RoadSettingId }; var player = CacheExHelper.GetFromCache <Player>(mapUnit.Uid); var lobbySession = SessionHelper.GetLobbySession(player.lobbyAppId); L2M_CreateInvite l2M_CreateInvite = (L2M_CreateInvite)await lobbySession.Call(new M2L_CreateInvite { InviteInfo = inviteData, }); if (l2M_CreateInvite.Error != ErrorCode.ERR_Success) { response.Error = ErrorCode.ERR_InviteIdNotFind; reply(response); return; } Invite inviteEntity = BsonSerializer.Deserialize <Invite>(l2M_CreateInvite.Json); CacheExHelper.WriteInCache(inviteEntity, out inviteEntity); // 告知對方 Player inviteTarget = CacheExHelper.GetFromCache <Player>(message.ReceiverUid); if (inviteTarget != null) { //在線上 廣播給指定玩家邀請訊息 G2C_TeamInviteReceiver g2c_TeamInviteReceiver = new G2C_TeamInviteReceiver(); g2c_TeamInviteReceiver.InviteId = inviteEntity.Id; g2c_TeamInviteReceiver.SenderName = inviteEntity.data.SenderName; GateMessageHelper.BroadcastTarget(g2c_TeamInviteReceiver, message.ReceiverUid); } // 推播 User u = await UserDataHelper.FindOneUser(message.ReceiverUid); var firebase = Game.Scene.GetComponent <FirebaseComponent>(); var lang = Game.Scene.GetComponent <LanguageComponent>(); // 多國2-'{0}'邀請你一起組隊! var body = lang.GetString(u.language, 2L); await firebase.SendOneNotification(u.firebaseDeviceToken, string.Empty, string.Format(body, user.name)); response.Error = ErrorCode.ERR_Success; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected async ETTask RunAsync(Session session, C2G_TeamInviteAccept message, Action <G2C_TeamInviteAccept> reply) { G2C_TeamInviteAccept response = new G2C_TeamInviteAccept(); try { //取得自身資料 Player player = session.GetComponent <SessionPlayerComponent>().Player; User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault(0)); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } //判斷邀請是否合法 var inviteComponent = Game.Scene.GetComponent <InviteComponent>(); var invite = inviteComponent.GetByInviteId(message.InviteId); if (invite == null) { response.Error = ErrorCode.ERR_InviteIdNotFind; reply(response); return; } if (invite.data.ReceiverUid != player?.uid) { response.Error = ErrorCode.ERR_InviteNotSelf; reply(response); return; } //刪除該邀請 await inviteComponent.DestroyByInviteId(message.InviteId); //判斷房間是否合法 var room = Game.Scene.GetComponent <RoomComponent>().Get(invite.data.TeamRoomId); if (room == null) { response.Error = ErrorCode.ERR_RoomIdNotFound; reply(response); return; } if (room.Type != RoomType.Team) { response.Error = ErrorCode.ERR_RoonTypeError; reply(response); return; } if (room.State != RoomState.Start) { response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter; reply(response); return; } var roomTeamComponent = room.GetComponent <RoomTeamComponent>(); if (roomTeamComponent == null) { response.Error = ErrorCode.ERR_RoomTeamComponentNull; reply(response); return; } if (room.info.NowMemberCount >= room.info.MaxMemberCount) { response.Error = ErrorCode.ERR_RoomTeamMemberIsFull; reply(response); return; } // 連接到Map伺服器,並創建Unit實體 IPEndPoint mapAddress = StartConfigComponent.Instance.Get(player.mapAppId).GetComponent <InnerConfig>().IPEndPoint; Session mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress); //建立Map實體並進入房間 G2M_MapUnitCreate g2M_MapUnitCreate = new G2M_MapUnitCreate(); g2M_MapUnitCreate.Uid = player.uid; g2M_MapUnitCreate.GateSessionId = session.InstanceId; g2M_MapUnitCreate.MapUnitInfo = new MapUnitInfo() { Name = user.name, Location = user.location, RoomId = room.Id, DistanceTravelled = 0, CharSetting = user.playerCharSetting, //PathId 一般組隊入場再決定 }; //建立自身MapUnit M2G_MapUnitCreate createUnit = (M2G_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate); g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId; player.EnterRoom(createUnit.MapUnitId, room); //對全體廣播自己剛建立的MapUnitInfo(不包含自己) TeamMemberData selfMemberData = roomTeamComponent.GetMember(player.uid); M2C_TeamModifyMember m2c_TeamModifyMember = new M2C_TeamModifyMember(); m2c_TeamModifyMember.Uid = player.uid; m2c_TeamModifyMember.MemberData = selfMemberData; MapMessageHelper.BroadcastRoom(room.Id, m2c_TeamModifyMember, player.uid); //回傳資料 response.Info = room.info; response.Data = roomTeamComponent.Data; for (int i = 0; i < roomTeamComponent.MemberDatas.Length; i++) { if (roomTeamComponent.MemberDatas[i] != null) { response.MemberDatas.Add(roomTeamComponent.MemberDatas[i]); } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
/// <summary> /// 使用AppleID登入 /// </summary> /// <param name="session"></param> /// <param name="info"></param> /// <param name="response"></param> /// <returns></returns> public async static ETTask AuthenticationByAppleId(Session session, AuthenticationInfo info, R2C_Authentication response) { string appleId = CryptographyHelper.AESDecrypt(info.Secret); ThirdPartyInfo appleInfo = new ThirdPartyInfo { id = appleId, }; long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); ThirdPartyUser thirdPartyUser = await UserDataHelper.FindOneThirdPartyUser(appleInfo.id, UserDataHelper.tagAppleId); User user = null; if (thirdPartyUser == null) { // 用AppleId註冊帳號 user = ComponentFactory.CreateWithId <User>(IdGenerater.GenerateId()); string salt = CryptographyHelper.GenerateRandomId(); string password = CryptographyHelper.GenerateRandomId(16); string hashPassword = CryptographyHelper.MD5Encoding(password, salt); user.salt = salt; user.hashPassword = hashPassword; user.email = appleInfo.email; user.name = user.Id.ToString(); user.gender = appleInfo.genderCode; user.location = appleInfo.locationCode; user.birthday = appleInfo.birthdayCode; user.createAt = now; user.playerCharSetting = new PlayerCharSetting(); user.playerCharSetting.CharacterId = 1L; user.playerRideTotalInfo = new RideTotalInfo(); user.language = info.Language; user.identity = (int)User.Identity.Player; user.userBagCapacity = EquipmentDataHelper.GetDefaultUserBag(); await UserDataHelper.SinUserUp(user); // 註冊第三方-AppleId thirdPartyUser = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId()); thirdPartyUser.uid = user.Id; thirdPartyUser.party = UserDataHelper.tagAppleId; thirdPartyUser.userId = appleInfo.id; thirdPartyUser.gender = appleInfo.gender; thirdPartyUser.location = appleInfo.location; thirdPartyUser.email = appleInfo.email; thirdPartyUser.name = appleInfo.name; thirdPartyUser.birthday = appleInfo.birthday; thirdPartyUser.createAt = now; await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser); // 註冊第三方-Guest thirdPartyUser = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId()); thirdPartyUser.uid = user.Id; thirdPartyUser.party = UserDataHelper.tagGuest; thirdPartyUser.userId = info.DeviceId; thirdPartyUser.name = ""; thirdPartyUser.gender = ""; thirdPartyUser.location = ""; thirdPartyUser.email = ""; thirdPartyUser.birthday = ""; thirdPartyUser.createAt = now; await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser); } else { user = await UserDataHelper.FindOneUser(thirdPartyUser.uid); } await SignInByUid(session, user, response, info.FirebaseDeviceToken, true, UserDataHelper.tagAppleId); }
public async static ETTask AuthenticationByFaceBook(Session session, AuthenticationInfo info, R2C_Authentication response) { string fbToken = info.Secret; bool isValidToken = await FacebookHelper.ValidateFacebookToken(fbToken); if (!isValidToken) { response.Error = ErrorCode.ERR_FBSignInFailed; return; } ThirdPartyInfo fbInfo = await FacebookHelper.GetFacebookUserInfo(fbToken); if (fbInfo == null) { response.Error = ErrorCode.ERR_FBSignInFailed; return; } long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); ThirdPartyUser thirdPartyUser = await UserDataHelper.FindOneThirdPartyUser(fbInfo.id, UserDataHelper.tagFB); User user = null; if (thirdPartyUser == null) { // 用FB註冊帳號 user = ComponentFactory.CreateWithId <User>(IdGenerater.GenerateId()); string salt = CryptographyHelper.GenerateRandomId(); string password = CryptographyHelper.GenerateRandomId(16); string hashPassword = CryptographyHelper.MD5Encoding(password, salt); user.salt = salt; user.hashPassword = hashPassword; user.email = fbInfo.email; user.name = fbInfo.name; user.gender = fbInfo.genderCode; user.location = fbInfo.locationCode; user.birthday = fbInfo.birthdayCode; user.createAt = now; user.playerCharSetting = new PlayerCharSetting(); user.playerCharSetting.CharacterId = 1L; user.playerRideTotalInfo = new RideTotalInfo(); user.language = info.Language; user.identity = (int)User.Identity.Player; user.userBagCapacity = EquipmentDataHelper.GetDefaultUserBag(); await UserDataHelper.SinUserUp(user); //註冊第三方-FB thirdPartyUser = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId()); thirdPartyUser.uid = user.Id; thirdPartyUser.party = UserDataHelper.tagFB; thirdPartyUser.userId = fbInfo.id; thirdPartyUser.gender = fbInfo.gender; thirdPartyUser.location = fbInfo.location; thirdPartyUser.email = fbInfo.email; thirdPartyUser.name = fbInfo.name; thirdPartyUser.birthday = fbInfo.birthday; thirdPartyUser.createAt = now; await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser); //註冊第三方-Guest thirdPartyUser = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId()); thirdPartyUser.uid = user.Id; thirdPartyUser.party = UserDataHelper.tagGuest; thirdPartyUser.userId = info.DeviceId; thirdPartyUser.name = ""; thirdPartyUser.gender = ""; thirdPartyUser.location = ""; thirdPartyUser.email = ""; thirdPartyUser.birthday = ""; thirdPartyUser.createAt = now; await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser); } else { user = await UserDataHelper.FindOneUser(thirdPartyUser.uid); } await SignInByUid(session, user, response, info.FirebaseDeviceToken, true, UserDataHelper.tagFB); }
public async static ETTask AuthenticationByGuest(Session session, AuthenticationInfo info, R2C_Authentication response) { string deviceUniqueIdentifier = string.Empty; try { deviceUniqueIdentifier = CryptographyHelper.AESDecrypt(info.Secret); } catch (Exception) { response.Error = ErrorCode.ERR_InvalidDeviceUniqueIdentifier; return; } if (string.IsNullOrEmpty(deviceUniqueIdentifier)) { response.Error = ErrorCode.ERR_DeviceUniqueIdentifierIsNull; return; } long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); ThirdPartyUser thirdPartyUser = await UserDataHelper.FindOneThirdPartyUser(deviceUniqueIdentifier, UserDataHelper.tagGuest); User user = null; if (thirdPartyUser == null) { user = ComponentFactory.CreateWithId <User>(IdGenerater.GenerateId()); string salt = CryptographyHelper.GenerateRandomId(); string password = CryptographyHelper.GenerateRandomId(16); string hashPassword = CryptographyHelper.MD5Encoding(password, salt); user.salt = salt; user.hashPassword = hashPassword; user.createAt = now; user.name = $"{user.Id}"; user.email = ""; user.playerCharSetting = new PlayerCharSetting(); user.playerCharSetting.CharacterId = 1L; user.playerRideTotalInfo = new RideTotalInfo(); user.language = info.Language; user.identity = (int)User.Identity.Player; user.userBagCapacity = EquipmentDataHelper.GetDefaultUserBag(); await UserDataHelper.SinUserUp(user); //註冊第三方-Guest thirdPartyUser = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId()); thirdPartyUser.uid = user.Id; thirdPartyUser.party = UserDataHelper.tagGuest; thirdPartyUser.userId = deviceUniqueIdentifier; thirdPartyUser.name = ""; thirdPartyUser.gender = ""; thirdPartyUser.location = ""; thirdPartyUser.email = ""; thirdPartyUser.birthday = ""; thirdPartyUser.createAt = now; await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser); } else { user = await UserDataHelper.FindOneUser(thirdPartyUser.uid); } await SignInByUid(session, user, response, info.FirebaseDeviceToken, true, UserDataHelper.tagGuest); }
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); } }
private async ETVoid RunAsync(Session session, C2G_TeamReservationCreate message, Action <G2C_TeamReservationCreate> reply) { G2C_TeamReservationCreate response = new G2C_TeamReservationCreate(); try { //取得自身資料 Player player = session.GetComponent <SessionPlayerComponent>().Player; User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } var reservationComponent = Game.Scene.GetComponent <ReservationComponent>(); var reservationList = reservationComponent.GetByUid(player.uid); if (reservationList?.OwnCount >= ReservationDataHelper.ReservationMaxCount) { response.Error = ErrorCode.ERR_ReservationIsFull; reply(response); return; } var reservationData = new ReservationAllData() { ReservationId = IdGenerater.GenerateId(), SenderName = user.name, SenderUid = player.uid, RoadSettingId = message.RoadSettingId, AwakeUTCTimeTick = message.StartUTCTimeTick - ReservationDataHelper.AwakeBeforeTimeTick, StartUTCTimeTick = message.StartUTCTimeTick, }; //邀請對象加入自己 reservationData.MemberUid.Add(player.uid); //邀請對象加入其他成員 if (message.MemberUid?.Count > 0) { reservationData.MemberUid.AddRange(message.MemberUid); } //寫入DB await ReservationDataHelper.Add(reservationData.ReservationId, reservationData); //建立預約資料實體 var newReservation = await reservationComponent.CreateReservation(reservationData); var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); //告知成員 for (int i = 0; i < reservationData.MemberUid?.Count; i++) { //告知對方 long targetMemberUid = reservationData.MemberUid[i]; Player reservationTarget = playerSync.Get <Player>(targetMemberUid); if (reservationTarget != null) { //在線上 廣播給指定玩家邀請訊息 G2C_TeamReservationAdd g2c_TeamReservationAdd = new G2C_TeamReservationAdd(); g2c_TeamReservationAdd.ReservationData = newReservation.data; GateMessageHelper.BroadcastTarget(g2c_TeamReservationAdd, new[] { targetMemberUid }); } // 推播 User u = await UserDataHelper.FindOneUser(targetMemberUid); var firebase = Game.Scene.GetComponent <FirebaseComponent>(); var lang = Game.Scene.GetComponent <LanguageComponent>(); //多國3-'{0}'預約了比賽並邀請你參加!預約時間為{1}。 var str = lang.GetString(u.language, 3L); //多國4-時。 var hourStr = lang.GetString(u.language, 4L); //多國5-分。 var minuteStr = lang.GetString(u.language, 5L); //多國6-秒。 var secondStr = lang.GetString(u.language, 6L); DateTime date = new DateTime(reservationData.StartUTCTimeTick); TimeSpan remainder = date - DateTime.UtcNow; string dateStr = string.Empty; List <string> list = new List <string>(); if (remainder.Hours > 0) { list.Add($"{remainder.Hours}{hourStr}"); } if (remainder.Minutes > 0) { list.Add($"{remainder.Minutes}{minuteStr}"); } //if (remainder.Seconds > 0) //{ // list.Add($"{remainder.Seconds}{secondStr}"); //} dateStr += string.Join(" ", list); await firebase.SendOneNotification(u.firebaseDeviceToken, string.Empty, string.Format(str, user.name, dateStr)); } //回傳資料 response.Error = ErrorCode.ERR_Success; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
private async ETVoid RunAsync(Player player, C2L_Announcement message, Action <L2C_Announcement> reply) { L2C_Announcement response = new L2C_Announcement(); 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 { ConfigComponent configComponent = Game.Scene.GetComponent <ConfigComponent>(); IConfig[] announcementSetting = configComponent.GetAll(typeof(AnnouncementSetting)); for (int i = 0; i < announcementSetting.Length; i++) { AnnouncementSetting setting = announcementSetting[i] as AnnouncementSetting; if (setting == null) { continue; } var announcementInfo = new AnnouncementInfo() { Timestamp = setting.timestamp }; switch (user.language) { case 41: // zh_tw = 41; announcementInfo.Title = setting.zh_tw_title; announcementInfo.Context = setting.zh_tw_context; break; case 40: // zh_cn = 40; announcementInfo.Title = setting.zh_cn_title; announcementInfo.Context = setting.zh_cn_context; break; case 10: // en = 10; announcementInfo.Title = setting.en_title; announcementInfo.Context = setting.en_context; break; } response.AnnouncementInfos.Add(announcementInfo); } response.Error = ErrorCode.ERR_Success; } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected async ETTask RunAsync(Player player, C2L_RoamingEnter message, Action <L2C_RoamingEnter> reply) { L2C_RoamingEnter response = new L2C_RoamingEnter(); try { var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>(); // 判斷是否還在舊的房間 if (player.roomID != 0L) { // 如果有就強制退房 await lobbyComponent.LeaveRoom(player.roomID, player.uid); } // 判斷房間是否合法 Room room = lobbyComponent.GetRoom(message.RoamingRoomId); if (room == null) { response.Error = ErrorCode.ERR_RoomIdNotFound; reply(response); return; } // 0518 Saitou add member Limit if (room.info.NowMemberCount >= room.info.MaxMemberCount) { response.Error = ErrorCode.ERR_RoomRoamingMemberIsFull; reply(response); return; } // 回傳房間設定 response.RoadSettingId = room.info.RoadSettingId; // 取得自身資料 User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } // 連接到Map伺服器,並創建Unit實體 Session mapSession = SessionHelper.GetMapSession(IdGenerater.GetAppId(room.Id)); // 建立Map實體並進入房間 L2M_MapUnitCreate g2M_MapUnitCreate = new L2M_MapUnitCreate(); g2M_MapUnitCreate.Uid = player.uid; g2M_MapUnitCreate.GateSessionId = player.gateSessionActorId; g2M_MapUnitCreate.MapUnitInfo = new MapUnitInfo() { Name = user.name, Location = user.location, RoomId = message.RoamingRoomId, DistanceTravelled = 0, SpeedMS = 0, CharSetting = user.playerCharSetting, PathId = room.info.NowMemberCount % 4, StartUTCTick = DateTime.UtcNow.Ticks, Uid = player.uid, }; // 建立自身MapUnit M2L_MapUnitCreate createUnit = (M2L_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate); g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId; // 進入房間 player.EnterRoom(createUnit.MapUnitId, room); player.StartRoom(); // 更新MapUnitId await Game.Scene.GetComponent <PlayerComponent>().Update(player); // TODO:紀錄 // 回傳自己MapUnitInfo response.SelfInfo = g2M_MapUnitCreate.MapUnitInfo; response.GlobalInfos = await lobbyComponent.GetAllMapUnitGlobalInfoOnRoom(room.Id); reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
private async ETVoid RunAsync(Session session, C2G_TeamReservationJoin message, Action <G2C_TeamReservationJoin> reply) { G2C_TeamReservationJoin response = new G2C_TeamReservationJoin(); try { //取得自身資料 Player player = session.GetComponent <SessionPlayerComponent>().Player; User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } //取得預約資料 var reservationComponent = Game.Scene.GetComponent <ReservationComponent>(); var reservation = reservationComponent.GetByReservationId(message.ReservationId); //判斷是否有該預約 if (reservation == null) { response.Error = ErrorCode.ERR_ReservationIdNotFind; reply(response); return; } //判斷是否為被邀請者 if (!reservation.allData.MemberUid.Contains(player.uid)) { response.Error = ErrorCode.ERR_ReservationNotTheOwner; reply(response); return; } //判斷是否有該房間 if (reservation.room == null) { response.Error = ErrorCode.ERR_ReservationRoomNotFind; reply(response); return; } //判斷該房間是否可以進入 if (reservation.room.State != RoomState.Start) { response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter; reply(response); return; } //判斷是否人滿 if (reservation.room.info.NowMemberCount >= reservation.room.info.MaxMemberCount) { response.Error = ErrorCode.ERR_RoomTeamMemberIsFull; reply(response); return; } //判斷房間資料是否正確 var roomTeamComponent = reservation.room.GetComponent <RoomTeamComponent>(); if (roomTeamComponent == null) { response.Error = ErrorCode.ERR_RoomTeamComponentNull; reply(response); return; } // 連接到Map伺服器,並創建Unit實體 IPEndPoint mapAddress = StartConfigComponent.Instance.Get(player.mapAppId).GetComponent <InnerConfig>().IPEndPoint; Session mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress); //建立Map實體並進入房間 G2M_MapUnitCreate g2M_MapUnitCreate = new G2M_MapUnitCreate(); g2M_MapUnitCreate.Uid = player.uid; g2M_MapUnitCreate.GateSessionId = session.InstanceId; g2M_MapUnitCreate.MapUnitInfo = new MapUnitInfo() { Name = user.name, Location = user.location, RoomId = reservation.room.Id, DistanceTravelled = 0, CharSetting = user.playerCharSetting, //PathId 一般組隊入場再決定 }; //建立自身MapUnit M2G_MapUnitCreate createUnit = (M2G_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate); g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId; player.EnterRoom(createUnit.MapUnitId, reservation.room); //對全體廣播自己剛建立的MapUnitInfo(不包含自己) TeamMemberData selfMemberData = roomTeamComponent.GetMember(player.uid); M2C_TeamModifyMember m2c_TeamModifyMember = new M2C_TeamModifyMember(); m2c_TeamModifyMember.Uid = player.uid; m2c_TeamModifyMember.MemberData = selfMemberData; MapMessageHelper.BroadcastRoom(reservation.room.Id, m2c_TeamModifyMember, player.uid); //回傳資料 response.Error = ErrorCode.ERR_Success; response.Info = reservation.room.info; response.Data = roomTeamComponent.Data; for (int i = 0; i < roomTeamComponent.MemberDatas.Length; i++) { if (roomTeamComponent.MemberDatas[i] != null) { response.MemberDatas.Add(roomTeamComponent.MemberDatas[i]); } } for (int i = 0; i < roomTeamComponent.ReservationMembers.Count; i++) { if (roomTeamComponent.ReservationMembers[i] != null) { response.ReservationMemberDatas.Add(roomTeamComponent.ReservationMembers[i]); } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
private async ETTask RunAsync(Player player, C2L_TeamReservationJoin message, Action <L2C_TeamReservationJoin> reply) { L2C_TeamReservationJoin response = new L2C_TeamReservationJoin(); try { //取得自身資料 User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } //取得預約資料 var reservationComponent = Game.Scene.GetComponent <ReservationComponent>(); var reservation = reservationComponent.GetByReservationId(message.ReservationId); //判斷是否有該預約 if (reservation == null) { response.Error = ErrorCode.ERR_ReservationIdNotFind; reply(response); return; } //判斷是否為被邀請者 if (!reservation.allData.MemberUid.Contains(player.uid)) { response.Error = ErrorCode.ERR_ReservationNotTheOwner; reply(response); return; } //判斷是否有該房間 if (reservation.room == null) { response.Error = ErrorCode.ERR_ReservationRoomNotFind; reply(response); return; } //判斷該房間是否可以進入 if (reservation.room.State != RoomState.Start) { response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter; reply(response); return; } //判斷是否人滿 if (reservation.room.info.NowMemberCount >= reservation.room.info.MaxMemberCount) { response.Error = ErrorCode.ERR_RoomTeamMemberIsFull; reply(response); return; } // 連接到Map伺服器,並創建Unit實體 Session mapSession = SessionHelper.GetMapSession(IdGenerater.GetAppId(reservation.room.Id)); //建立Map實體並進入房間 L2M_MapUnitCreate g2M_MapUnitCreate = new L2M_MapUnitCreate(); g2M_MapUnitCreate.Uid = player.uid; g2M_MapUnitCreate.GateSessionId = player.gateSessionActorId; g2M_MapUnitCreate.MapUnitInfo = new MapUnitInfo() { Name = user.name, Location = user.location, RoomId = reservation.room.Id, DistanceTravelled = 0, CharSetting = user.playerCharSetting, //PathId 一般組隊入場再決定 }; //建立自身MapUnit M2L_MapUnitCreate createUnit = (M2L_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate); g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId; player.EnterRoom(createUnit.MapUnitId, reservation.room); // 更新MapUnitId await Game.Scene.GetComponent <PlayerComponent>().Update(player); var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>(); //對全體廣播自己剛建立的MapUnitInfo(不包含自己) await lobbyComponent.BroadcastTeamModifyMember(player.uid, reservation.room.Id); //回傳資料 var result = await lobbyComponent.GetTeamInfo(reservation.room.Id); response.Error = ErrorCode.ERR_Success; response.Info = reservation.room.info; response.Data = result.Item1; for (int i = 0; i < result.Item2.Count; i++) { if (result.Item2[i] != null) { response.MemberDatas.Add(result.Item2[i]); } } for (int i = 0; i < result.Item3.Count; i++) { if (result.Item3[i] != null) { response.ReservationMemberDatas.Add(result.Item3[i]); } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
private async ETTask RunAsync(Session session, C2G_TeamReservationCancel message, Action <G2C_TeamReservationCancel> reply) { G2C_TeamReservationCancel response = new G2C_TeamReservationCancel(); try { //取得自身資料 Player player = session.GetComponent <SessionPlayerComponent>().Player; User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } //判斷是否為發起人 var reservationComponent = Game.Scene.GetComponent <ReservationComponent>(); var reservation = reservationComponent.GetByReservationId(message.ReservationId); if (reservation.allData.SenderUid != player.uid) { response.Error = ErrorCode.ERR_ReservationIsNotLeader; reply(response); return; } if (reservation.room != null) { if (reservation.room.State != RoomState.Ready && reservation.room.State != RoomState.Start) { response.Error = ErrorCode.ERR_ReservationRoomStateCanNotToRemove; reply(response); return; } else { //告知失去房間訊息 M2C_TeamLose m2c_TeamLose = new M2C_TeamLose(); m2c_TeamLose.LoseType = TeamLoseType.Disband; List <MapUnit> broadcastMapUnits = new List <MapUnit>(); broadcastMapUnits.AddRange(reservation.room.GetAll()); MapMessageHelper.BroadcastTarget(m2c_TeamLose, broadcastMapUnits); //讓隊員清空Map相關訊息 var proxy = Game.Scene.GetComponent <CacheProxyComponent>(); var playerSync = proxy.GetMemorySyncSolver <Player>(); var mapUnits = reservation.room.GetAll(); for (int i = 0; i < mapUnits?.Count; i++) { //Player移除mapUnitId var targetPlayer = playerSync.Get <Player>(mapUnits[i].Uid); targetPlayer?.LeaveRoom(); //中斷指定玩家與Map的連接 mapUnits[i].GetComponent <MapUnitGateComponent>().IsDisconnect = true; //TODO:G2M_TeamDisband抄C2M_TeamDisbandHandler Game.Scene.GetComponent <MapUnitComponent>().Remove(mapUnits[i].Id); } //刪除房間實體 var roomComponent = Game.Scene.GetComponent <RoomComponent>(); await roomComponent.DestroyRoom(reservation.room.Id); } } //刪除預約實體(DB會一起刪除) await reservationComponent.DestroyReservation(message.ReservationId); //回傳資料 response.Error = ErrorCode.ERR_Success; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected async ETTask RunAsync(Session session, C2G_RoamingEnter message, Action <G2C_RoamingEnter> reply) { G2C_RoamingEnter response = new G2C_RoamingEnter(); try { //判斷房間是否合法 Room room = Game.Scene.GetComponent <RoomComponent>().Get(message.RoamingRoomId); if (room == null) { response.Error = ErrorCode.ERR_RoomIdNotFound; reply(response); return; } //回傳房間設定 response.RoadSettingId = room.info.RoadSettingId; //取得自身資料 Player player = session.GetComponent <SessionPlayerComponent>().Player; User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } // 連接到Map伺服器,並創建Unit實體 IPEndPoint mapAddress = StartConfigComponent.Instance.Get(player.mapAppId).GetComponent <InnerConfig>().IPEndPoint; Session mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress); //建立Map實體並進入房間 G2M_MapUnitCreate g2M_MapUnitCreate = new G2M_MapUnitCreate(); g2M_MapUnitCreate.Uid = player.uid; g2M_MapUnitCreate.GateSessionId = session.InstanceId; g2M_MapUnitCreate.MapUnitInfo = new MapUnitInfo() { Name = user.name, Location = user.location, RoomId = message.RoamingRoomId, DistanceTravelled = 0, SpeedMS = 0, CharSetting = user.playerCharSetting, PathId = room.info.NowMemberCount % 4, StartUTCTick = DateTime.UtcNow.Ticks }; //建立自身MapUnit M2G_MapUnitCreate createUnit = (M2G_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate); g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId; //進入房間 player.EnterRoom(createUnit.MapUnitId, room); player.StartRoom(); //TODO:紀錄 //回傳自己MapUnitInfo response.SelfInfo = g2M_MapUnitCreate.MapUnitInfo; var mapUnits = room.GetAll(); for (int i = 0; i < mapUnits.Count; i++) { response.GlobalInfos.Add(mapUnits[i].GlobalInfo); } reply(response); ////對全體廣播MapUnitInfo(不包含自己) //M2C_MapUnitCreate m2C_MapUnitCreate = new M2C_MapUnitCreate(); //m2C_MapUnitCreate.MapUnitInfo = g2M_MapUnitCreate.MapUnitInfo; //MapMessageHelper.BroadcastRoom(g2M_MapUnitCreate.MapUnitInfo.RoomId, m2C_MapUnitCreate, player.Uid); // 紀錄所有MapUnit(包含自己) //List<MapUnit> mapUnits = room.GetAll(); //for (int i = 0; i < mapUnits.Count; i++) //{ // response.MapUnitInfos.Add(mapUnits[i].Info); //} } catch (Exception e) { ReplyError(response, e, reply); } }
private async ETTask RunAsync(Player player, C2L_RefuseRelationshipApply message, Action <L2C_RefuseRelationshipApply> reply) { L2C_RefuseRelationshipApply response = new L2C_RefuseRelationshipApply(); try { long uid = player.uid; //尋找指定RelationshipApplyInfo var targetApplyInfo = await RelationshipDataHelper.GetRelationshipApplyInfoByApplyId(message.ApplyId); //判斷是否存在RelationshipApplyInfo if (targetApplyInfo == null) { response.Error = ErrorCode.ERR_RelationshipApplyInfo_NotFind; reply(response); return; } //判斷是否為申請目標 if (targetApplyInfo.ReceiverUid != uid) { response.Error = ErrorCode.ERR_RelationshipApplyInfo_NotReceiver; reply(response); return; } // 刪除關係申請 await RelationshipDataHelper.RemoveRelationship(targetApplyInfo.ApplyId); // 傳送senderUser更新申請列表 var notifyRelationshipApplyStateIsRequested = new L2C_NotifyRelationshipApplyState() { DeleteApplyId = message.ApplyId, IsRequested = true, }; GateMessageHelper.BroadcastTarget(notifyRelationshipApplyStateIsRequested, targetApplyInfo.SenderUid); // 傳送receiverUser更新申請列表 var notifyRelationshipApplyStateNotRequested = new L2C_NotifyRelationshipApplyState() { DeleteApplyId = message.ApplyId, IsRequested = false, }; GateMessageHelper.BroadcastTarget(notifyRelationshipApplyStateNotRequested, targetApplyInfo.ReceiverUid); var uidUser = await UserDataHelper.FindOneUser(uid); var senderUser = await UserDataHelper.FindOneUser(targetApplyInfo.SenderUid); // 推播告知senderUser var firebase = Game.Scene.GetComponent <FirebaseComponent>(); var lang = Game.Scene.GetComponent <LanguageComponent>(); // 8 = {0}拒絕你的好友邀請! var body = lang.GetString(senderUser.language, 8); await firebase.SendOneNotification(senderUser.firebaseDeviceToken, string.Empty, string.Format(body, uidUser.name)); response.Error = ErrorCode.ERR_Success; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected async ETTask RunAsync(Player player, C2L_TeamInviteAccept message, Action <L2C_TeamInviteAccept> reply) { L2C_TeamInviteAccept response = new L2C_TeamInviteAccept(); try { var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>(); // 取得自身資料 User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault(0)); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } // 判斷邀請是否合法 var inviteComponent = Game.Scene.GetComponent <InviteComponent>(); var invite = inviteComponent.GetByInviteId(message.InviteId); if (invite == null) { response.Error = ErrorCode.ERR_InviteIdNotFind; reply(response); return; } if (invite.data.ReceiverUid != player?.uid) { response.Error = ErrorCode.ERR_InviteNotSelf; reply(response); return; } // 刪除該邀請 await inviteComponent.DestroyByInviteId(message.InviteId); // 判斷房間是否合法 var room = lobbyComponent.GetRoom(invite.data.TeamRoomId); if (room == null) { response.Error = ErrorCode.ERR_RoomIdNotFound; reply(response); return; } if (room.Type != RoomType.Team) { response.Error = ErrorCode.ERR_RoonTypeError; reply(response); return; } if (room.State != RoomState.Start) { response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter; reply(response); return; } if (room.info.NowMemberCount >= room.info.MaxMemberCount) { response.Error = ErrorCode.ERR_RoomTeamMemberIsFull; reply(response); return; } // 連接到Map伺服器,並創建Unit實體 Session mapSession = SessionHelper.GetMapSession(IdGenerater.GetAppId(room.Id)); // 建立Map實體並進入房間 L2M_MapUnitCreate l2M_MapUnitCreate = new L2M_MapUnitCreate(); l2M_MapUnitCreate.Uid = player.uid; l2M_MapUnitCreate.GateSessionId = player.gateSessionActorId; l2M_MapUnitCreate.MapUnitInfo = new MapUnitInfo() { Name = user.name, Location = user.location, RoomId = room.Id, DistanceTravelled = 0, CharSetting = user.playerCharSetting, // PathId 一般組隊入場再決定 }; // 建立自身MapUnit M2L_MapUnitCreate createUnit = (M2L_MapUnitCreate)await mapSession.Call(l2M_MapUnitCreate); l2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId; player.EnterRoom(createUnit.MapUnitId, room); // 更新Player的MapUnitId await Game.Scene.GetComponent <PlayerComponent>().Update(player); // 對全體廣播自己剛建立的MapUnitInfo(不包含自己) await lobbyComponent.BroadcastTeamModifyMember(player.uid, room.Id); // 回傳資料 var teamData = await lobbyComponent.GetTeamInfo(room.Id); response.Info = room.info; response.Data = teamData.Item1; for (int i = 0; i < teamData.Item2.Count; i++) { if (teamData.Item2[i] != null) { response.MemberDatas.Add(teamData.Item2[i]); } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }