コード例 #1
0
        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));
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        /// <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);
                });
            }
        }
コード例 #4
0
        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
    }