internal void DeleteMail(ulong userGuid, ulong mailGuid) { UserProcessScheduler dataProcess = UserServer.Instance.UserProcessScheduler; UserInfo user = dataProcess.GetUserInfo(userGuid); if (null != user) { List<MailInfo> mails; if (m_UserMails.TryGetValue(userGuid, out mails)) { if (null != mails) { MailInfo info = null; int ct = mails.Count; int index = 0; for (; index < ct; ++index) { if (mails[index].m_MailGuid == mailGuid) { info = mails[index]; break; } } if (null != info) { mails.RemoveAt(index); } } } MailStateInfo mailStateInfo = user.MailStateInfo; if (!mailStateInfo.IsAlreadyReceived(mailGuid)) { int wholeCt = m_WholeMails.Count; for (int index = 0; index < wholeCt; ++index) { MailInfo info = m_WholeMails[index]; if (info.m_MailGuid == mailGuid) { mailStateInfo.DeleteMail(mailGuid); } } } } }
private void HandleQueryUserStateResult(Msg_BL_QueryUserStateResult msg_, PBChannel channel, int src, uint session) { UserProcessScheduler dataProcess = UserServer.Instance.UserProcessScheduler; UserInfo user = dataProcess.GetUserInfo(msg_.Guid); if (user != null && user.CurrentState == UserState.Room) { user.CurrentState = UserState.Online; } }
private void HandleUserChangeScene(Msg_BL_UserChangeScene msg_, PBChannel channel, int src, uint session) { UserProcessScheduler dataProcess = UserServer.Instance.UserProcessScheduler; UserInfo user = dataProcess.GetUserInfo(msg_.Guid); if (user != null) { user.SceneId = msg_.SceneId; } }
private void HandleUserOffline(Msg_BL_UserOffline msg_, PBChannel channel, int src, uint session) { UserProcessScheduler dataProcess = UserServer.Instance.UserProcessScheduler; UserInfo user = dataProcess.GetUserInfo(msg_.Guid); if (user != null && user.CurrentState == UserState.Room) { user.CurrentState = UserState.Online; user.LeftLife = 0; } }
internal void ReceiveMail(ulong userGuid, ulong mailGuid) { UserProcessScheduler dataProcess = UserServer.Instance.UserProcessScheduler; UserInfo user = dataProcess.GetUserInfo(userGuid); if (null != user) { List <TableMailInfoWrap> mails; if (m_UserMails.TryGetValue((long)userGuid, out mails)) { if (null != mails) { TableMailInfoWrap info = null; int ct = mails.Count; int index = 0; for (; index < ct; ++index) { if (mails[index].Guid == mailGuid) { info = mails[index]; break; } } if (null != info && CheckBagCapacity(user, info)) { mails.RemoveAt(index); ExtractMailAttachment(info, userGuid); } } } MailStateInfo mailStateInfo = user.MailStateInfo; if (!mailStateInfo.IsAlreadyReceived(mailGuid)) { int wholeCt = m_WholeMails.Count; for (int index = 0; index < wholeCt; ++index) { TableMailInfoWrap info = m_WholeMails[index]; if (info.Guid == mailGuid) { if (CheckBagCapacity(user, info)) { mailStateInfo.ReceiveMail(mailGuid); if (info.LevelDemand <= user.Level && info.SendDate >= user.CreateTime && info.ExpiryDate >= DateTime.Now) { ExtractMailAttachment(info, userGuid); } } } } } } }
internal void SendUserMail(MailInfo userMail, int validityPeriod) { userMail.m_MailGuid = GenMailGuid(); userMail.m_SendTime = DateTime.Now; userMail.m_ExpiryDate = userMail.m_SendTime.AddDays(validityPeriod); List<MailInfo> mails = null; if (!m_UserMails.TryGetValue(userMail.m_Receiver, out mails)) { mails = new List<MailInfo>(); m_UserMails.Add(userMail.m_Receiver, mails); } mails.Add(userMail); UserProcessScheduler dataProcess = UserServer.Instance.UserProcessScheduler; UserInfo user = dataProcess.GetUserInfo(userMail.m_Receiver); if (null != user && user.CurrentState != UserState.DropOrOffline) { NodeMessage newMailMsg = new NodeMessage(LobbyMessageDefine.Msg_LC_NotifyNewMail, userMail.m_Receiver); NodeMessageDispatcher.SendNodeMessage(user.NodeName, newMailMsg); } }
//------------------------------------------------------------------------------------------------------ private void ObserveEnterSceneResult(NodeMessage msg, int handle, uint seq) { if (handle != 0) { return; } GameFrameworkMessage.NodeMessageWithGuid headerMsg = msg.m_NodeHeader as GameFrameworkMessage.NodeMessageWithGuid; if (null != headerMsg) { GameFrameworkMessage.EnterSceneResult protoMsg = msg.m_ProtoData as GameFrameworkMessage.EnterSceneResult; if (null != protoMsg) { UserProcessScheduler dataProcess = UserServer.Instance.UserProcessScheduler; UserInfo user = dataProcess.GetUserInfo(headerMsg.m_Guid); if (user != null && protoMsg.result == 0) { user.CurrentState = UserState.Room; user.SceneId = protoMsg.scene_type; } } } }
internal void ReadMail(ulong userGuid, ulong mailGuid) { UserProcessScheduler dataProcess = UserServer.Instance.UserProcessScheduler; UserInfo user = dataProcess.GetUserInfo(userGuid); if (null != user) { List <TableMailInfoWrap> mails; if (m_UserMails.TryGetValue((long)userGuid, out mails)) { if (null != mails) { int ct = mails.Count; int index = 0; for (; index < ct; ++index) { if (mails[index].Guid == mailGuid) { TableMailInfoWrap info = mails[index]; info.IsRead = true; break; } } } } MailStateInfo mailStateInfo = user.MailStateInfo; int wholeCt = m_WholeMails.Count; for (int index = 0; index < wholeCt; ++index) { TableMailInfoWrap info = m_WholeMails[index]; if (info.Guid == mailGuid) { mailStateInfo.ReadMail(mailGuid); break; } } } }
private void HandleEnterScene(NodeMessage msg, int handle, uint seq) { GameFrameworkMessage.NodeMessageWithGuid headerMsg = msg.m_NodeHeader as GameFrameworkMessage.NodeMessageWithGuid; if (null != headerMsg) { GameFrameworkMessage.EnterScene protoMsg = msg.m_ProtoData as GameFrameworkMessage.EnterScene; if (null != protoMsg) { ulong guid = headerMsg.m_Guid; int sceneId = protoMsg.m_SceneId; int wantRoomId = protoMsg.m_RoomId; UserProcessScheduler dataProcess = UserServer.Instance.UserProcessScheduler; UserInfo user = dataProcess.GetUserInfo(guid); if (user != null) { Msg_LB_RequestEnterScene builder = new Msg_LB_RequestEnterScene(); Msg_LB_BigworldUserBaseInfo baseInfoBuilder = new Msg_LB_BigworldUserBaseInfo(); baseInfoBuilder.AccountId = user.AccountId; baseInfoBuilder.NodeName = user.NodeName; baseInfoBuilder.WorldId = UserServerConfig.WorldId; baseInfoBuilder.ClientInfo = user.ClientInfo; baseInfoBuilder.StartServerTime = UserServerConfig.StartServerTime; baseInfoBuilder.SceneId = user.SceneId; builder.BaseInfo = baseInfoBuilder; builder.User = UserThread.BuildRoomUserInfo(user, 0, 0); builder.SceneId = sceneId; builder.WantRoomId = wantRoomId; builder.FromSceneId = user.SceneId; UserServer.Instance.BigworldChannel.Send(builder); } } } }
internal void GetMailList(ulong userGuid) { UserProcessScheduler dataProcess = UserServer.Instance.UserProcessScheduler; UserInfo user = dataProcess.GetUserInfo(userGuid); if (null != user) { List<MailInfoForMessage> mailList = new List<MailInfoForMessage>(); List<MailInfo> mails; if (m_UserMails.TryGetValue(userGuid, out mails)) { int ct = mails.Count; for (int ix = 0; ix < ct; ++ix) { MailInfo mailInfo = mails[ix]; if (mailInfo.m_ExpiryDate >= DateTime.Now) { MailInfoForMessage mailInfoForMsg = new MailInfoForMessage(); mailInfoForMsg.m_AlreadyRead = mailInfo.m_AlreadyRead; mailInfoForMsg.m_MailGuid = mailInfo.m_MailGuid; mailInfoForMsg.m_Title = mailInfo.m_Title; mailInfoForMsg.m_Sender = mailInfo.m_Sender; mailInfoForMsg.m_SendTime = mailInfo.m_SendTime.ToString("yyyyMMddHHmmss"); mailInfoForMsg.m_Text = mailInfo.m_Text; mailInfoForMsg.m_Money = mailInfo.m_Money; mailInfoForMsg.m_Gold = mailInfo.m_Gold; int itemCt = mailInfo.m_Items.Count; if (itemCt > 0) { for (int index = 0; index < itemCt; ++index) { MailItemForMessage mailItem = new MailItemForMessage(); mailItem.m_ItemId = mailInfo.m_Items[index].m_ItemId; mailItem.m_ItemNum = mailInfo.m_Items[index].m_ItemNum; mailInfoForMsg.m_Items.Add(mailItem); } } mailList.Add(mailInfoForMsg); } } } MailStateInfo mailStateInfo = user.MailStateInfo; //这里不对用户数据加锁,因为用户的邮件状态的改变都在这个线程完成(除上线时的数据加载) int wholeMailCt = m_WholeMails.Count; for (int ix = 0; ix < wholeMailCt; ++ix) { MailInfo mailInfo = m_WholeMails[ix]; if (mailInfo.m_LevelDemand <= user.Level && mailInfo.m_SendTime >= user.CreateTime && mailInfo.m_ExpiryDate >= DateTime.Now && !mailStateInfo.IsAlreadyReceived(mailInfo.m_MailGuid)) { if (!mailStateInfo.HaveMail(mailInfo.m_MailGuid)) { mailStateInfo.AddMail(mailInfo.m_MailGuid, mailInfo.m_ExpiryDate); } MailInfoForMessage mailInfoForMsg = new MailInfoForMessage(); mailInfoForMsg.m_AlreadyRead = mailStateInfo.IsAlreadyRead(mailInfo.m_MailGuid); mailInfoForMsg.m_MailGuid = mailInfo.m_MailGuid; mailInfoForMsg.m_Title = mailInfo.m_Title; mailInfoForMsg.m_Sender = mailInfo.m_Sender; mailInfoForMsg.m_SendTime = mailInfo.m_SendTime.ToString("yyyyMMddHHmmss"); mailInfoForMsg.m_Text = mailInfo.m_Text; mailInfoForMsg.m_Money = mailInfo.m_Money; mailInfoForMsg.m_Gold = mailInfo.m_Gold; int itemCt = mailInfo.m_Items.Count; if (itemCt > 0) { for (int index = 0; index < itemCt; ++index) { MailItemForMessage mailItem = new MailItemForMessage(); mailItem.m_ItemId = mailInfo.m_Items[index].m_ItemId; mailItem.m_ItemNum = mailInfo.m_Items[index].m_ItemNum; mailInfoForMsg.m_Items.Add(mailItem); } } mailList.Add(mailInfoForMsg); } } NodeMessage syncMailListMsg = new NodeMessage(LobbyMessageDefine.Msg_LC_SyncMailList, userGuid); GameFrameworkMessage.Msg_LC_SyncMailList protoMsg = new Msg_LC_SyncMailList(); protoMsg.m_Mails.AddRange(mailList); syncMailListMsg.m_ProtoData = protoMsg; NodeMessageDispatcher.SendNodeMessage(user.NodeName, syncMailListMsg); } }