private static void HandleEventGroupFormed(IRpcProtocol protocol, IEventData eventData) { var groupFormed = new GroupFormed(protocol, eventData); if (!groupFormed.IsValid) { _logger.ErrorFormat("[HandleEventGroupFormed]: Received an invalid {0}", eventData.GetType()); return; } MmoWorld.Instance.PrimaryFiber.Enqueue(() => DoGroupFormed(groupFormed)); }
private static void DoGroupFormed(GroupFormed groupFormed) { Group existingGroup; if (GroupManager.Instance.TryGetGroup(groupFormed.GroupGuid, out existingGroup)) { _logger.WarnFormat("[DoGroupFormed]: Existing group found (Guid={0}). Deforming the old group.", existingGroup.Guid); existingGroup.Deform(); } var group = new Group(MmoWorld.Instance); group.FormExistingGroup(groupFormed.GroupGuid, groupFormed.LeaderInfo); }
/// <summary> /// Informs the those in the groups that have been formed about the groups. /// </summary> /// <param name="toInform">The groups formed.</param> private void InformGroupsFormed(IEnumerable <IEnumerable <QueueGroup> > toInform) { foreach (IEnumerable <QueueGroup> group in toInform) { //Inform individual groups IEnumerable <T> entities = group.SelectMany(g => g.task.Entities); IEnumerable <EntityGroup <T> > subGroups = group.Select(p => p.task.Entities); //Inform all entities they've been cancelled foreach (QueueGroup queueGroup in group) { queueGroup.task.SetMatchmakingState(MatchmakingState.Success, subGroups, entities); } //Invoke group formed callback GroupFormedEventArgs <T> args = new GroupFormedEventArgs <T>(subGroups, entities); ThreadHelper.DispatchIfNeeded(() => { GroupFormed?.Invoke(this, args); }); } }
private OperationResponse HandleOperationLeaveWorld(OperationRequest operationRequest) { var operation = new LeaveWorld(Protocol, operationRequest); if (!operation.IsValid) { return new OperationResponse(operationRequest.OperationCode) { ReturnCode = (short)ResultCode.InvalidOperationParameter, DebugMessage = operation.GetErrorMessage() } } ; SocialSession session; if (social.SessionCache.TryGetSessionBySessionId(operation.SessionId, out session)) { session.LeaveWorld(operation.WorldId); } return(null); } #endregion #region Implementation of IWorld /// <summary> /// Gets the group manager /// </summary> IGroupManager IWorld.GroupManager { get { return(this); } } #endregion #region Implementation of IGroupManager void IGroupManager.FormGroup(MmoGuid groupGuid, GroupMemberStructure leader) { var groupFormed = new GroupFormed { GroupGuid = groupGuid, LeaderInfo = leader, }; this.SendEvent(new EventData((byte)ServerEventCode.GroupFormed, groupFormed), new SendParameters()); this.DoAddMember(groupGuid, leader); } void IGroupManager.DisbandGroup(MmoGuid groupGuid) { var groupDisbanded = new GroupDisbanded { GroupGuid = groupGuid, }; this.SendEvent(new EventData((byte)ServerEventCode.GroupDisbanded, groupDisbanded), new SendParameters()); } void IGroupManager.AddMember(MmoGuid groupGuid, GroupMemberStructure member) { this.DoAddMember(groupGuid, member); } void DoAddMember(MmoGuid groupGuid, GroupMemberStructure member) { SocialSession session; if (social.SessionCache.TryGetSessionBySessionName(member.Name, out session)) { var groupMemberAddedSession = new GroupMemberAddedSession { GroupGuid = groupGuid, MemberInfo = member, SessionId = session.SessionId }; this.SendEvent(new EventData((byte)ServerEventCode.GroupMemberAddedSession, groupMemberAddedSession), new SendParameters()); } else { var groupMemberAdded = new GroupMemberAdded { GroupGuid = groupGuid, MemberInfo = member, }; this.SendEvent(new EventData((byte)ServerEventCode.GroupMemberAdded, groupMemberAdded), new SendParameters()); } } void IGroupManager.RemoveMember(MmoGuid groupGuid, MmoGuid memberGuid) { var groupMemberRemoved = new GroupMemberRemoved { GroupGuid = groupGuid, MemberGuid = memberGuid, }; this.SendEvent(new EventData((byte)ServerEventCode.GroupMemberRemoved, groupMemberRemoved), new SendParameters()); } void IGroupManager.UpdateMemberStatus(MmoGuid groupGuid, MmoGuid memberGuid, OnlineStatus status) { switch (status) { case OnlineStatus.Online: var groupMemberOnline = new GroupMemberOnline { GroupGuid = groupGuid, MemberGuid = memberGuid, }; this.SendEvent(new EventData((byte)ServerEventCode.GroupMemberOnline, groupMemberOnline), new SendParameters()); break; case OnlineStatus.Offline: var groupMemberOffline = new GroupMemberOffline { GroupGuid = groupGuid, MemberGuid = memberGuid, }; this.SendEvent(new EventData((byte)ServerEventCode.GroupMemberOffline, groupMemberOffline), new SendParameters()); break; } } #endregion }