private static void OnGameAllowServerCommandMessageReceived(GameAllowServerCommandMessage message)
 {
     if (GameAvatarManager.TryGet(message.AccountId, out GameAvatar document))
     {
         document.AddServerCommand(message.ServerCommand);
     }
 }
Beispiel #2
0
        public override void Destruct()
        {
            GameAvatarManager.ExecuteServerCommandsInOfflineMode(this.GameAvatar);
            GameAvatarManager.Save(this.GameAvatar);
            GameMatchmakingManager.Enqueue(this.GameAvatar);

            this.GameAvatar.CurrentSession = null;

            this.DestructGameState();
            base.Destruct();
        }
 private static void OnNewAvatarStreamMessageReceived(CreateAvatarStreamMessage message)
 {
     if (GameAvatarManager.TryGet(message.AccountId, out GameAvatar document))
     {
         ServerRequestManager.Create(new CreateAvatarStreamRequestMessage
         {
             OwnerId = document.Id,
             Entry   = message.Entry
         }, ServerManager.GetDocumentSocket(11, document.Id)).OnComplete = document.OnAvatarStreamCreated;
     }
 }
 private static void OnAllianceLeavedMessageReceived(AllianceLeavedMessage message)
 {
     if (GameAvatarManager.TryGet(message.AccountId, out GameAvatar document))
     {
         if (document.LogicClientAvatar.IsInAlliance() && document.LogicClientAvatar.GetAllianceId().Equals(message.AllianceId))
         {
             LogicLeaveAllianceCommand logicLeaveAllianceCommand = new LogicLeaveAllianceCommand();
             logicLeaveAllianceCommand.SetAllianceData(message.AllianceId);
             document.AddServerCommand(logicLeaveAllianceCommand);
         }
     }
 }
Beispiel #5
0
        public static void Init()
        {
            ServerGame.GameDatabase = new CouchbaseDatabase("magic-players", "game");

            GameResourceManager.Init();
            GameMatchmakingManager.Init();
            GameDuelMatchmakingManager.Init();
            GameAvatarManager.Init();
            GameSessionManager.Init();
            LiveReplayManager.Init();
            GameBaseGenerator.Init();
            WordCensorUtil.Init();
        }
 private static void OnGameAvatarRequestMessageReceived(GameAvatarRequestMessage message)
 {
     if (GameAvatarManager.TryGet(message.AccountId, out GameAvatar document))
     {
         ServerRequestManager.SendResponse(new GameAvatarResponseMessage
         {
             Document = document,
             Success  = true
         }, message);
     }
     else
     {
         ServerRequestManager.SendResponse(new GameAvatarResponseMessage(), message);
     }
 }
        private static void OnForwardLogicMessageRequestMessageReceived(ForwardLogicRequestMessage message)
        {
            PiranhaMessage logicMessage = LogicMagicMessageFactory.Instance.CreateMessageByType(message.MessageType);

            if (logicMessage == null)
            {
                throw new Exception("logicMessage should not be NULL!");
            }

            logicMessage.GetByteStream().SetByteArray(message.MessageBytes, message.MessageLength);
            logicMessage.SetMessageVersion(message.MessageVersion);
            logicMessage.Decode();

            if (!logicMessage.IsServerToClientMessage())
            {
                switch (logicMessage.GetMessageType())
                {
                case AskForAvatarProfileMessage.MESSAGE_TYPE:
                {
                    AskForAvatarProfileMessage askForAvatarProfileMessage = (AskForAvatarProfileMessage)logicMessage;
                    LogicLong avatarId = askForAvatarProfileMessage.RemoveAvatarId();

                    if (GameAvatarManager.TryGet(avatarId, out GameAvatar document))
                    {
                        AvatarProfileMessage   avatarProfileMessage   = new AvatarProfileMessage();
                        AvatarProfileFullEntry avatarProfileFullEntry = new AvatarProfileFullEntry();

                        avatarProfileFullEntry.SetLogicClientAvatar(document.LogicClientAvatar);
                        avatarProfileFullEntry.SetCompressedHomeJSON(document.LogicClientHome.GetCompressibleHomeJSON().GetCompressed());

                        avatarProfileMessage.SetAvatarProfileFullEntry(avatarProfileFullEntry);

                        ServerMessageManager.SendMessage(GameMessageManager.CreateForwardLogicMessage(avatarProfileMessage, message.SessionId), ServerManager.GetProxySocket(message.SessionId));
                    }
                    else
                    {
                        AvatarProfileFailedMessage avatarProfileFailedMessage = new AvatarProfileFailedMessage();
                        avatarProfileFailedMessage.SetErrorType(AvatarProfileFailedMessage.ErrorType.NOT_FOUND);
                        ServerMessageManager.SendMessage(GameMessageManager.CreateForwardLogicMessage(avatarProfileFailedMessage, message.SessionId),
                                                         ServerManager.GetProxySocket(message.SessionId));
                    }

                    break;
                }
                }
            }
        }
Beispiel #8
0
        public GameSession(StartServerSessionMessage message) : base(message)
        {
            this.LogicMessageManager = new LogicMessageManager(this);
            this.GameAvatar          = GameAvatarManager.TryGet(this.AccountId, out GameAvatar document) ? document : GameAvatarManager.Create(this.AccountId);

            if (this.GameAvatar.CurrentSession != null)
            {
                GameSessionManager.Remove(this.GameAvatar.CurrentSession.Id);
            }
            this.GameAvatar.CurrentSession = this;

            GameMatchmakingManager.Dequeue(this.GameAvatar);
            ServerRequestManager.Create(new BindServerSocketRequestMessage
            {
                SessionId  = this.Id,
                ServerType = 10,
                ServerId   = -1
            }, this.m_sockets[1], 10).OnComplete = this.OnHomeServerBound;
        }
        private static void OnHomeStateCallbackMessageReceived(GameStateCallbackMessage message)
        {
            if (GameAvatarManager.TryGet(message.AccountId, out GameAvatar gameDocument))
            {
                gameDocument.LogicClientAvatar = message.LogicClientAvatar;

                if (message.HomeJSON != null)
                {
                    for (int i = 0; i < message.ExecutedServerCommands.Size(); i++)
                    {
                        LogicServerCommand serverCommand = message.ExecutedServerCommands[i];

                        for (int j = 0; j < gameDocument.ServerCommands.Size(); j++)
                        {
                            if (gameDocument.ServerCommands[j].GetId() == serverCommand.GetId())
                            {
                                gameDocument.ServerCommands.Remove(j);
                                break;
                            }
                        }
                    }

                    gameDocument.LogicClientHome.GetCompressibleHomeJSON().Set(message.HomeJSON);
                    gameDocument.LogicClientHome.SetShieldDurationSeconds(message.RemainingShieldTime);
                    gameDocument.LogicClientHome.SetGuardDurationSeconds(message.RemainingGuardTime);
                    gameDocument.LogicClientHome.SetPersonalBreakSeconds(message.NextPersonalBreakTime);
                    gameDocument.SaveTime = message.SaveTime;
                }

                if (gameDocument.LogicClientAvatar.IsInAlliance() && message.AvatarChanges.Size() != 0)
                {
                    ServerMessageManager.SendMessage(new AllianceAvatarChangesMessage
                    {
                        AccountId     = gameDocument.LogicClientAvatar.GetAllianceId(),
                        MemberId      = gameDocument.LogicClientAvatar.GetId(),
                        AvatarChanges = message.AvatarChanges
                    }, 11);
                }

                GameSession currentSession = gameDocument.CurrentSession;

                if (currentSession != null)
                {
                    DateTime utc = DateTime.UtcNow;

                    if (utc.Subtract(currentSession.LastDbSave).TotalSeconds > 2)
                    {
                        GameAvatarManager.Save(gameDocument);
                        currentSession.LastDbSave = utc;
                    }

                    if (message.SessionId != currentSession.Id)
                    {
                        currentSession.SendPiranhaMessage(new OutOfSyncMessage(), 1);
                        currentSession.SendMessage(new StopSessionMessage {
                            Reason = 1
                        }, 1);
                        return;
                    }

                    if (message.AvatarChanges.Size() != 0)
                    {
                        for (int i = 0; i < message.AvatarChanges.Size(); i++)
                        {
                            if (message.AvatarChanges[i].GetAvatarChangeType() == AvatarChangeType.ALLIANCE_JOINED)
                            {
                                currentSession.BindAllianceServer();
                            }
                        }
                    }
                }
                else
                {
                    GameAvatarManager.Save(gameDocument);
                }
            }
        }
        private static void OnGameCreateAllianceInvitationRequestMessageReceived(GameCreateAllianceInvitationRequestMessage message)
        {
            if (GameAvatarManager.TryGet(message.AccountId, out GameAvatar avatar))
            {
                if (avatar.LogicClientAvatar.IsInAlliance() || avatar.HasServerCommandOfType(LogicCommandType.JOIN_ALLIANCE) || avatar.PendingAllianceJoinResponse)
                {
                    ServerRequestManager.SendResponse(new GameCreateAllianceInvitationResponseMessage
                    {
                        ErrorReason = GameCreateAllianceInvitationResponseMessage.Reason.ALREADY_IN_ALLIANCE
                    }, message);
                    return;
                }

                if (!avatar.LogicClientAvatar.HasAllianceCastle())
                {
                    ServerRequestManager.SendResponse(new GameCreateAllianceInvitationResponseMessage
                    {
                        ErrorReason = GameCreateAllianceInvitationResponseMessage.Reason.NO_CASTLE
                    }, message);
                    return;
                }

                ServerRequestManager.Create(new LoadAvatarStreamOfTypeRequestMessage
                {
                    StreamIds      = avatar.AvatarStreamList,
                    SenderAvatarId = message.Entry.GetSenderAvatarId(),
                    Type           = AvatarStreamEntryType.ALLIANCE_INVITATION
                }, ServerManager.GetDocumentSocket(11, avatar.Id), 5).OnComplete = args =>
                {
                    if (args.ErrorCode == ServerRequestError.Success && args.ResponseMessage.Success)
                    {
                        LoadAvatarStreamOfTypeResponseMessage loadAvatarStreamOfTypeResponseMessage = (LoadAvatarStreamOfTypeResponseMessage)args.ResponseMessage;

                        for (int i = 0; i < loadAvatarStreamOfTypeResponseMessage.StreamList.Size(); i++)
                        {
                            AllianceInvitationAvatarStreamEntry allianceInvitationAvatarStreamEntry = (AllianceInvitationAvatarStreamEntry)loadAvatarStreamOfTypeResponseMessage.StreamList[i];

                            if (allianceInvitationAvatarStreamEntry.GetAllianceId().Equals(message.Entry.GetAllianceId()))
                            {
                                ServerRequestManager.SendResponse(new GameCreateAllianceInvitationResponseMessage
                                {
                                    ErrorReason = GameCreateAllianceInvitationResponseMessage.Reason.ALREADY_HAS_AN_INVITE
                                }, message);
                                return;
                            }
                        }

                        if (loadAvatarStreamOfTypeResponseMessage.StreamList.Size() >= 10)
                        {
                            ServerRequestManager.SendResponse(new GameCreateAllianceInvitationResponseMessage
                            {
                                ErrorReason = GameCreateAllianceInvitationResponseMessage.Reason.HAS_TOO_MANY_INVITES
                            }, message);
                        }

                        ServerMessageManager.SendMessage(new CreateAvatarStreamMessage
                        {
                            AccountId = message.AccountId,
                            Entry     = message.Entry
                        }, 9);

                        ServerRequestManager.SendResponse(new GameCreateAllianceInvitationResponseMessage
                        {
                            Success = true
                        }, message);
                    }
                    else
                    {
                        ServerRequestManager.SendResponse(new GameCreateAllianceInvitationResponseMessage
                        {
                            ErrorReason = GameCreateAllianceInvitationResponseMessage.Reason.GENERIC
                        }, message);
                    }
                };
            }
            else
            {
                ServerRequestManager.SendResponse(new GameCreateAllianceInvitationResponseMessage
                {
                    ErrorReason = GameCreateAllianceInvitationResponseMessage.Reason.GENERIC
                }, message);
            }
        }
        private static void OnGameJoinAllianceRequestMessageReceived(GameJoinAllianceRequestMessage message)
        {
            if (GameAvatarManager.TryGet(message.AccountId, out GameAvatar document))
            {
                if (document.LogicClientAvatar.IsInAlliance() || document.HasServerCommandOfType(LogicCommandType.JOIN_ALLIANCE))
                {
                    ServerRequestManager.SendResponse(new GameJoinAllianceResponseMessage
                    {
                        ErrorReason = GameJoinAllianceResponseMessage.Reason.ALREADY_IN_ALLIANCE
                    }, message);
                    return;
                }

                if (!document.LogicClientAvatar.HasAllianceCastle())
                {
                    ServerRequestManager.SendResponse(new GameJoinAllianceResponseMessage
                    {
                        ErrorReason = GameJoinAllianceResponseMessage.Reason.NO_CASTLE
                    }, message);
                    return;
                }

                if (document.PendingAllianceJoinResponse || message.AvatarStreamId != null && document.AvatarStreamList.IndexOf(message.AvatarStreamId) == -1)
                {
                    ServerRequestManager.SendResponse(new GameJoinAllianceResponseMessage
                    {
                        ErrorReason = GameJoinAllianceResponseMessage.Reason.GENERIC
                    }, message);
                    return;
                }

                document.PendingAllianceJoinResponse = true;

                ServerRequestManager.Create(new AllianceJoinRequestMessage
                {
                    AllianceId = message.AllianceId,
                    Avatar     = document.LogicClientAvatar,
                    Created    = message.Created,
                    Invited    = message.Invited
                }, ServerManager.GetDocumentSocket(11, message.AllianceId), 15).OnComplete = args =>
                {
                    document.PendingAllianceJoinResponse = false;

                    if (args.ErrorCode == ServerRequestError.Success)
                    {
                        AllianceJoinResponseMessage allianceJoinResponseMessage = (AllianceJoinResponseMessage)args.ResponseMessage;

                        if (allianceJoinResponseMessage.Success)
                        {
                            if (message.AvatarStreamId != null)
                            {
                                document.RemoveAvatarStreamEntry(message.AvatarStreamId);
                            }

                            LogicJoinAllianceCommand logicJoinAllianceCommand = new LogicJoinAllianceCommand();
                            logicJoinAllianceCommand.SetAllianceData(allianceJoinResponseMessage.AllianceId, allianceJoinResponseMessage.AllianceName, allianceJoinResponseMessage.AllianceBadgeId, allianceJoinResponseMessage.AllianceLevel, allianceJoinResponseMessage.Created);
                            document.AddServerCommand(logicJoinAllianceCommand);
                            ServerRequestManager.SendResponse(new GameJoinAllianceResponseMessage
                            {
                                Success = true
                            }, message);
                        }
                        else
                        {
                            GameJoinAllianceResponseMessage gameJoinAllianceResponseMessage = new GameJoinAllianceResponseMessage();

                            switch (allianceJoinResponseMessage.ErrorReason)
                            {
                            case AllianceJoinResponseMessage.Reason.GENERIC:
                                gameJoinAllianceResponseMessage.ErrorReason = GameJoinAllianceResponseMessage.Reason.GENERIC;
                                break;

                            case AllianceJoinResponseMessage.Reason.FULL:
                                gameJoinAllianceResponseMessage.ErrorReason = GameJoinAllianceResponseMessage.Reason.FULL;
                                break;

                            case AllianceJoinResponseMessage.Reason.CLOSED:
                                gameJoinAllianceResponseMessage.ErrorReason = GameJoinAllianceResponseMessage.Reason.CLOSED;
                                break;

                            case AllianceJoinResponseMessage.Reason.SCORE:
                                gameJoinAllianceResponseMessage.ErrorReason = GameJoinAllianceResponseMessage.Reason.SCORE;
                                break;

                            case AllianceJoinResponseMessage.Reason.BANNED:
                                gameJoinAllianceResponseMessage.ErrorReason = GameJoinAllianceResponseMessage.Reason.BANNED;
                                break;
                            }

                            ServerRequestManager.SendResponse(gameJoinAllianceResponseMessage, message);
                        }
                    }
                    else
                    {
                        ServerRequestManager.SendResponse(new GameJoinAllianceResponseMessage
                        {
                            ErrorReason = GameJoinAllianceResponseMessage.Reason.GENERIC
                        }, message);
                    }
                };
            }
        }