/// <summary>
        /// This is function which read request from map server to spawn another map servers
        /// Then it will response back when requested map server is ready
        /// </summary>
        /// <param name="messageHandler"></param>
        protected void HandleRequestSpawnMap(LiteNetLibMessageHandler messageHandler)
        {
            RequestSpawnMapMessage message       = messageHandler.ReadMessage <RequestSpawnMapMessage>();
            List <long>            connectionIds = new List <long>(mapSpawnServerPeers.Keys);
            // Random map-spawn server to spawn map, will use returning ackId as reference to map-server's transport handler and ackId
            uint ackId = RequestSpawnMap(connectionIds[Random.Range(0, connectionIds.Count)], message, OnRequestSpawnMap);

            // Add ack Id / transport handler to dictionary which will be used in OnRequestSpawnMap() function
            // To send map spawn response to map-server
            requestSpawnMapHandlers.Add(ackId, new KeyValuePair <TransportHandler, uint>(messageHandler.transportHandler, message.ackId));
        }
Ejemplo n.º 2
0
        protected virtual void HandleRequestCashPackageInfo(LiteNetLibMessageHandler messageHandler)
        {
            var connectionId    = messageHandler.connectionId;
            var message         = messageHandler.ReadMessage <BaseAckMessage>();
            var responseMessage = new ResponseCashPackageInfoMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = AckResponseCode.Error;
            responseMessage.error        = ResponseCashPackageInfoMessage.Error.NotAvailable;
            ServerSendPacket(connectionId, SendOptions.ReliableOrdered, MsgTypes.CashPackageInfo, responseMessage);
        }
Ejemplo n.º 3
0
        protected virtual void HandleRequestCashPackageBuyValidation(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            RequestCashPackageBuyValidationMessage  message         = messageHandler.ReadMessage <RequestCashPackageBuyValidationMessage>();
            ResponseCashPackageBuyValidationMessage responseMessage = new ResponseCashPackageBuyValidationMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = AckResponseCode.Error;
            responseMessage.error        = ResponseCashPackageBuyValidationMessage.Error.NotAvailable;
            ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, MsgTypes.CashPackageBuyValidation, responseMessage);
        }
Ejemplo n.º 4
0
        protected virtual void HandleUpdateMapInfoAtClient(LiteNetLibMessageHandler messageHandler)
        {
            // Don't set map info again at server
            if (IsServer)
            {
                return;
            }
            UpdateMapInfoMessage message = messageHandler.ReadMessage <UpdateMapInfoMessage>();

            SetMapInfo(message.mapId);
        }
        protected void HandleRequestAppServerAddress(LiteNetLibMessageHandler messageHandler)
        {
            var connectionId = messageHandler.connectionId;
            var message      = messageHandler.ReadMessage <RequestAppServerAddressMessage>();
            var error        = ResponseAppServerAddressMessage.Error.None;
            var peerInfo     = new CentralServerPeerInfo();

            switch (message.peerType)
            {
            // TODO: Balancing servers when there are multiple servers with same type
            case CentralServerPeerType.MapSpawnServer:
                if (mapSpawnServerPeers.Count > 0)
                {
                    peerInfo = mapSpawnServerPeers.Values.First();
                    Debug.Log("[Central] Request Map Spawn Address: [" + connectionId + "]");
                }
                else
                {
                    error = ResponseAppServerAddressMessage.Error.ServerNotFound;
                    Debug.Log("[Central] Request Map Spawn Address: [" + connectionId + "] [" + error + "]");
                }
                break;

            case CentralServerPeerType.MapServer:
                var mapName = message.extra;
                if (!mapServerPeersBySceneName.TryGetValue(mapName, out peerInfo))
                {
                    error = ResponseAppServerAddressMessage.Error.ServerNotFound;
                    Debug.Log("[Central] Request Map Address: [" + connectionId + "] [" + mapName + "] [" + error + "]");
                }
                break;

            case CentralServerPeerType.Chat:
                if (chatServerPeers.Count > 0)
                {
                    peerInfo = chatServerPeers.Values.First();
                    Debug.Log("[Central] Request Chat Address: [" + connectionId + "]");
                }
                else
                {
                    error = ResponseAppServerAddressMessage.Error.ServerNotFound;
                    Debug.Log("[Central] Request Chat Address: [" + connectionId + "] [" + error + "]");
                }
                break;
            }
            var responseMessage = new ResponseAppServerAddressMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseAppServerAddressMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            responseMessage.peerInfo     = peerInfo;
            ServerSendPacket(connectionId, SendOptions.ReliableOrdered, MMOMessageTypes.ResponseAppServerAddress, responseMessage);
        }
        private void HandleUpdateMapUserAtServer(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            UpdateUserCharacterMessage message = messageHandler.ReadMessage <UpdateUserCharacterMessage>();

            if (mapServerConnectionIds.Contains(connectionId))
            {
                UserCharacterData userData;
                switch (message.type)
                {
                case UpdateUserCharacterMessage.UpdateType.Add:
                    if (!mapUsersById.ContainsKey(message.data.id))
                    {
                        mapUsersById[message.data.id] = message.data;
                        connectionIdsByCharacterId[message.data.id] = connectionId;
                        connectionIdsByCharacterName[message.data.characterName] = connectionId;
                        UpdateMapUser(UpdateUserCharacterMessage.UpdateType.Add, message.data, connectionId);
                        if (LogInfo)
                        {
                            Debug.Log("[Chat] Add map user: "******" by " + connectionId);
                        }
                    }
                    break;

                case UpdateUserCharacterMessage.UpdateType.Remove:
                    if (mapUsersById.TryGetValue(message.data.id, out userData))
                    {
                        mapUsersById.Remove(userData.id);
                        connectionIdsByCharacterId.Remove(userData.id);
                        connectionIdsByCharacterName.Remove(userData.characterName);
                        UpdateMapUser(UpdateUserCharacterMessage.UpdateType.Remove, userData, connectionId);
                        if (LogInfo)
                        {
                            Debug.Log("[Chat] Remove map user: "******" by " + connectionId);
                        }
                    }
                    break;

                case UpdateUserCharacterMessage.UpdateType.Online:
                    if (mapUsersById.ContainsKey(message.data.id))
                    {
                        mapUsersById[message.data.id] = message.data;
                        UpdateMapUser(UpdateUserCharacterMessage.UpdateType.Online, message.data, connectionId);
                        if (LogInfo)
                        {
                            Debug.Log("[Chat] Update map user: "******" by " + connectionId);
                        }
                    }
                    break;
                }
            }
        }
Ejemplo n.º 7
0
        private IEnumerator HandleRequestCreateCharacterRoutine(LiteNetLibMessageHandler messageHandler)
        {
            var connectionId  = messageHandler.connectionId;
            var message       = messageHandler.ReadMessage <RequestCreateCharacterMessage>();
            var error         = ResponseCreateCharacterMessage.Error.None;
            var characterName = message.characterName;
            var dataId        = message.dataId;
            var entityId      = message.entityId;
            CentralUserPeerInfo userPeerInfo;
            var findCharacterNameJob = new FindCharacterNameJob(Database, characterName);

            findCharacterNameJob.Start();
            yield return(StartCoroutine(findCharacterNameJob.WaitFor()));

            if (findCharacterNameJob.result > 0)
            {
                error = ResponseCreateCharacterMessage.Error.CharacterNameAlreadyExisted;
            }
            else if (!userPeers.TryGetValue(connectionId, out userPeerInfo))
            {
                error = ResponseCreateCharacterMessage.Error.NotLoggedin;
            }
            else if (string.IsNullOrEmpty(characterName) || characterName.Length < minCharacterNameLength)
            {
                error = ResponseCreateCharacterMessage.Error.TooShortCharacterName;
            }
            else if (characterName.Length > maxCharacterNameLength)
            {
                error = ResponseCreateCharacterMessage.Error.TooLongCharacterName;
            }
            else if (!GameInstance.PlayerCharacters.ContainsKey(dataId) ||
                     !GameInstance.PlayerCharacterEntities.ContainsKey(entityId))
            {
                error = ResponseCreateCharacterMessage.Error.InvalidData;
            }
            else
            {
                var characterId   = GenericUtils.GetUniqueId();
                var characterData = new PlayerCharacterData();
                characterData.Id = characterId;
                characterData.SetNewPlayerCharacterData(characterName, dataId, entityId);
                var createCharacterJob = new CreateCharacterJob(Database, userPeerInfo.userId, characterData);
                createCharacterJob.Start();
                yield return(StartCoroutine(createCharacterJob.WaitFor()));
            }
            var responseMessage = new ResponseCreateCharacterMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseCreateCharacterMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            ServerSendPacket(connectionId, SendOptions.ReliableOrdered, MMOMessageTypes.ResponseCreateCharacter, responseMessage);
        }
Ejemplo n.º 8
0
        // CentralAppServerRegister message handlers
        private void SampleHandleMsgFromCentralServer(LiteNetLibMessageHandler messageHandler)
        {
            string text         = messageHandler.reader.GetString();
            long   clientTime   = messageHandler.reader.GetLong();
            long   connectionId = messageHandler.reader.GetLong();

            Debug.Log("[CustomFromClientToCentralServer] map-server receive from central-server: " + text + " " + clientTime + " then send this to client");
            ServerSendPacket(connectionId, LiteNetLib.DeliveryMethod.ReliableOrdered, 10001, (writer) =>
            {
                writer.Put(text);
                writer.Put(ServerUnixTime);
            });
        }
Ejemplo n.º 9
0
        private IEnumerator HandleRequestCashPackageBuyValidationRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            RequestCashPackageBuyValidationMessage message = messageHandler.ReadMessage <RequestCashPackageBuyValidationMessage>();

            // TODO: Validate purchasing at server side
            // Set response data
            ResponseCashPackageBuyValidationMessage.Error error = ResponseCashPackageBuyValidationMessage.Error.None;
            int dataId = message.dataId;
            int cash   = 0;
            BasePlayerCharacterEntity playerCharacter;
            UserCharacterData         userData;

            if (!playerCharacters.TryGetValue(connectionId, out playerCharacter) ||
                !usersById.TryGetValue(playerCharacter.Id, out userData))
            {
                error = ResponseCashPackageBuyValidationMessage.Error.UserNotFound;
            }
            else
            {
                // Get current cash will return this in case it cannot increase cash
                GetCashJob job = new GetCashJob(Database, userData.userId);
                job.Start();
                yield return(StartCoroutine(job.WaitFor()));

                cash = job.result;
                CashPackage cashPackage;
                if (!GameInstance.CashPackages.TryGetValue(dataId, out cashPackage))
                {
                    error = ResponseCashPackageBuyValidationMessage.Error.PackageNotFound;
                }
                else
                {
                    IncreaseCashJob increaseCashJob = new IncreaseCashJob(Database, userData.userId, cashPackage.cashAmount);
                    increaseCashJob.Start();
                    yield return(StartCoroutine(increaseCashJob.WaitFor()));

                    cash = increaseCashJob.result;
                }
            }
            // Send response message
            ResponseCashPackageBuyValidationMessage responseMessage = new ResponseCashPackageBuyValidationMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseCashPackageBuyValidationMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            responseMessage.dataId       = dataId;
            responseMessage.cash         = cash;
            ServerSendPacket(connectionId, SendOptions.ReliableOrdered, MsgTypes.CashPackageBuyValidation, responseMessage);
        }
        // Map-Server message handlers
        private void SampleHandleMsgFromMapServer(LiteNetLibMessageHandler messageHandler)
        {
            string text         = messageHandler.reader.GetString();
            long   clientTime   = messageHandler.reader.GetLong();
            long   connectionId = messageHandler.reader.GetLong();

            Debug.Log("[CustomFromClientToCentralServer] central-server receive: " + text + " " + clientTime + " then send lower-case text back to map-server");
            ServerSendPacket(messageHandler.connectionId, LiteNetLib.DeliveryMethod.ReliableOrdered, 10001, (writer) =>
            {
                writer.Put(text.ToLower());
                writer.Put(clientTime);
                writer.Put(connectionId);
            });
        }
Ejemplo n.º 11
0
        private async UniTaskVoid HandleRequestValidateAccessTokenRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            RequestValidateAccessTokenMessage message = messageHandler.ReadMessage <RequestValidateAccessTokenMessage>();

            ResponseValidateAccessTokenMessage.Error error = ResponseValidateAccessTokenMessage.Error.None;
            string userId      = message.userId;
            string accessToken = message.accessToken;
            ValidateAccessTokenResp validateAccessTokenResp = await DbServiceClient.ValidateAccessTokenAsync(new ValidateAccessTokenReq()
            {
                UserId      = userId,
                AccessToken = accessToken
            });

            if (!validateAccessTokenResp.IsPass)
            {
                error       = ResponseValidateAccessTokenMessage.Error.InvalidAccessToken;
                userId      = string.Empty;
                accessToken = string.Empty;
            }
            else
            {
                CentralUserPeerInfo userPeerInfo;
                if (userPeersByUserId.TryGetValue(userId, out userPeerInfo))
                {
                    userPeersByUserId.Remove(userPeerInfo.userId);
                    userPeers.Remove(userPeerInfo.connectionId);
                }
                userPeerInfo = new CentralUserPeerInfo();
                userPeerInfo.connectionId = connectionId;
                userPeerInfo.userId       = userId;
                userPeerInfo.accessToken  = accessToken = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", "");
                userPeersByUserId[userId] = userPeerInfo;
                userPeers[connectionId]   = userPeerInfo;
                await DbServiceClient.UpdateAccessTokenAsync(new UpdateAccessTokenReq()
                {
                    UserId      = userPeerInfo.userId,
                    AccessToken = accessToken
                });
            }
            ResponseValidateAccessTokenMessage responseMessage = new ResponseValidateAccessTokenMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseValidateAccessTokenMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            responseMessage.userId       = userId;
            responseMessage.accessToken  = accessToken;
            ServerSendResponse(connectionId, MMOMessageTypes.ResponseValidateAccessToken, responseMessage);
        }
Ejemplo n.º 12
0
        // Server message handlers
        private void SampleHandleMsgFromClient(LiteNetLibMessageHandler messageHandler)
        {
            // Receive message from client at map-server
            // Then keep transport handler at server to use later to send message to client
            string text       = messageHandler.reader.GetString();
            long   clientTime = messageHandler.reader.GetLong();

            Debug.Log("[CustomFromClientToCentralServer] map-server receive from client: " + text + " " + clientTime + " then send this to central-server");
            CentralAppServerRegister.SendPacket(LiteNetLib.DeliveryMethod.ReliableOrdered, 10001, (writer) =>
            {
                writer.Put(sampleMessageToCentralServer);
                writer.Put(ServerUnixTime);
                writer.Put(messageHandler.connectionId);
            });
        }
Ejemplo n.º 13
0
        private async UniTaskVoid HandleRequestUserLoginRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            RequestUserLoginMessage message = messageHandler.ReadMessage <RequestUserLoginMessage>();

            ResponseUserLoginMessage.Error error = ResponseUserLoginMessage.Error.None;
            ValidateUserLoginResp          validateUserLoginResp = await DbServiceClient.ValidateUserLoginAsync(new ValidateUserLoginReq()
            {
                Username = message.username,
                Password = message.password
            });

            string userId      = validateUserLoginResp.UserId;
            string accessToken = string.Empty;

            if (string.IsNullOrEmpty(userId))
            {
                error  = ResponseUserLoginMessage.Error.InvalidUsernameOrPassword;
                userId = string.Empty;
            }
            else if (userPeersByUserId.ContainsKey(userId) || MapContainsUser(userId))
            {
                error  = ResponseUserLoginMessage.Error.AlreadyLogin;
                userId = string.Empty;
            }
            else
            {
                CentralUserPeerInfo userPeerInfo = new CentralUserPeerInfo();
                userPeerInfo.connectionId = connectionId;
                userPeerInfo.userId       = userId;
                userPeerInfo.accessToken  = accessToken = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", "");
                userPeersByUserId[userId] = userPeerInfo;
                userPeers[connectionId]   = userPeerInfo;
                await DbServiceClient.UpdateAccessTokenAsync(new UpdateAccessTokenReq()
                {
                    UserId      = userId,
                    AccessToken = accessToken
                });
            }
            ResponseUserLoginMessage responseMessage = new ResponseUserLoginMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseUserLoginMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            responseMessage.userId       = userId;
            responseMessage.accessToken  = accessToken;
            ServerSendResponse(connectionId, MMOMessageTypes.ResponseUserLogin, responseMessage);
        }
        private void HandleUpdateGuildAtServer(LiteNetLibMessageHandler messageHandler)
        {
            var connectionId = messageHandler.connectionId;
            var message      = messageHandler.ReadMessage <UpdateGuildMessage>();

            if (mapServerConnectionIds.Contains(connectionId))
            {
                foreach (var mapServerConnectionId in mapServerConnectionIds)
                {
                    if (mapServerConnectionId != connectionId)
                    {
                        ServerSendPacket(mapServerConnectionId, SendOptions.ReliableOrdered, MMOMessageTypes.UpdateGuild, message);
                    }
                }
            }
        }
Ejemplo n.º 15
0
        private void HandleUpdatePartyMemberAtServer(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            UpdateSocialMemberMessage message = messageHandler.ReadMessage <UpdateSocialMemberMessage>();

            if (mapServerConnectionIds.Contains(connectionId))
            {
                foreach (long mapServerConnectionId in mapServerConnectionIds)
                {
                    if (mapServerConnectionId != connectionId)
                    {
                        ServerSendPacket(mapServerConnectionId, SendOptions.ReliableOrdered, MMOMessageTypes.UpdatePartyMember, message);
                    }
                }
            }
        }
        private void HandleUpdateGuildAtServer(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId          = messageHandler.connectionId;
            UpdateGuildMessage message = messageHandler.ReadMessage <UpdateGuildMessage>();

            if (mapServerConnectionIds.Contains(connectionId))
            {
                foreach (long mapServerConnectionId in mapServerConnectionIds)
                {
                    if (mapServerConnectionId != connectionId)
                    {
                        ServerSendPacket(mapServerConnectionId, DeliveryMethod.ReliableOrdered, MMOMessageTypes.UpdateGuild, message);
                    }
                }
            }
        }
Ejemplo n.º 17
0
        private IEnumerator HandleRequestValidateAccessTokenRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            RequestValidateAccessTokenMessage message = messageHandler.ReadMessage <RequestValidateAccessTokenMessage>();

            ResponseValidateAccessTokenMessage.Error error = ResponseValidateAccessTokenMessage.Error.None;
            string userId      = message.userId;
            string accessToken = message.accessToken;
            ValidateAccessTokenJob validateAccessTokenJob = new ValidateAccessTokenJob(Database, userId, accessToken);

            validateAccessTokenJob.Start();
            yield return(StartCoroutine(validateAccessTokenJob.WaitFor()));

            if (!validateAccessTokenJob.result)
            {
                error       = ResponseValidateAccessTokenMessage.Error.InvalidAccessToken;
                userId      = string.Empty;
                accessToken = string.Empty;
            }
            else
            {
                CentralUserPeerInfo userPeerInfo;
                if (userPeersByUserId.TryGetValue(userId, out userPeerInfo))
                {
                    userPeersByUserId.Remove(userPeerInfo.userId);
                    userPeers.Remove(userPeerInfo.connectionId);
                }
                userPeerInfo = new CentralUserPeerInfo();
                userPeerInfo.connectionId = connectionId;
                userPeerInfo.userId       = userId;
                userPeerInfo.accessToken  = accessToken = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", "");
                userPeersByUserId[userId] = userPeerInfo;
                userPeers[connectionId]   = userPeerInfo;
                UpdateAccessTokenJob updateAccessTokenJob = new UpdateAccessTokenJob(Database, userId, accessToken);
                updateAccessTokenJob.Start();
                yield return(StartCoroutine(updateAccessTokenJob.WaitFor()));
            }
            ResponseValidateAccessTokenMessage responseMessage = new ResponseValidateAccessTokenMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseValidateAccessTokenMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            responseMessage.userId       = userId;
            responseMessage.accessToken  = accessToken;
            ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, MMOMessageTypes.ResponseValidateAccessToken, responseMessage);
        }
        private void HandleChatAtServer(LiteNetLibMessageHandler messageHandler)
        {
            var connectionId = messageHandler.connectionId;
            var message      = messageHandler.ReadMessage <ChatMessage>();

            if (LogInfo)
            {
                Debug.Log("Handle chat: " + message.channel + " sender: " + message.sender + " receiver: " + message.receiver + " message: " + message.message);
            }
            switch (message.channel)
            {
            case ChatChannel.Global:
                if (GMCommands.IsGMCommand(message.message))
                {
                    HandleGMCommand(message.sender, message.message);
                }
                else
                {
                    ServerSendPacketToAllConnections(SendOptions.ReliableOrdered, MMOMessageTypes.Chat, message);
                }
                break;

            case ChatChannel.Party:
            case ChatChannel.Guild:
                // Send message to all map servers, let's map servers filter messages
                ServerSendPacketToAllConnections(SendOptions.ReliableOrdered, MMOMessageTypes.Chat, message);
                break;

            case ChatChannel.Whisper:
                long senderConnectionId   = 0;
                long receiverConnectionId = 0;
                // Send message to map server which have the character
                if (!string.IsNullOrEmpty(message.sender) &&
                    connectionIdsByCharacterName.TryGetValue(message.sender, out senderConnectionId))
                {
                    ServerSendPacket(senderConnectionId, SendOptions.ReliableOrdered, MMOMessageTypes.Chat, message);
                }
                if (!string.IsNullOrEmpty(message.receiver) &&
                    connectionIdsByCharacterName.TryGetValue(message.receiver, out receiverConnectionId) &&
                    (receiverConnectionId != senderConnectionId))
                {
                    ServerSendPacket(receiverConnectionId, SendOptions.ReliableOrdered, MMOMessageTypes.Chat, message);
                }
                break;
            }
        }
Ejemplo n.º 19
0
        protected override void HandleChatAtServer(LiteNetLibMessageHandler messageHandler)
        {
            var message = FillChatChannelId(messageHandler.ReadMessage <ChatMessage>());

            // Local chat will processes immediately, not have to be sent to chat server
            if (message.channel == ChatChannel.Local &&
                !GMCommands.IsGMCommand(message.message))
            {
                ReadChatMessage(message);
                return;
            }
            // Send chat message to chat server, for MMO mode chat message handling by chat server
            if (ChatNetworkManager.IsClientConnected)
            {
                ChatNetworkManager.Client.SendEnterChat(null, MMOMessageTypes.Chat, message.channel, message.message, message.sender, message.receiver, message.channelId);
            }
        }
Ejemplo n.º 20
0
        private IEnumerator HandleRequestUserLoginRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            RequestUserLoginMessage message = messageHandler.ReadMessage <RequestUserLoginMessage>();

            ResponseUserLoginMessage.Error error       = ResponseUserLoginMessage.Error.None;
            ValidateUserLoginJob           validateJob = new ValidateUserLoginJob(Database, message.username, message.password);

            validateJob.Start();
            yield return(StartCoroutine(validateJob.WaitFor()));

            string userId      = validateJob.result;
            string accessToken = string.Empty;

            if (string.IsNullOrEmpty(userId))
            {
                error  = ResponseUserLoginMessage.Error.InvalidUsernameOrPassword;
                userId = string.Empty;
            }
            else if (userPeersByUserId.ContainsKey(userId) || MapContainsUser(userId))
            {
                error  = ResponseUserLoginMessage.Error.AlreadyLogin;
                userId = string.Empty;
            }
            else
            {
                CentralUserPeerInfo userPeerInfo = new CentralUserPeerInfo();
                userPeerInfo.connectionId = connectionId;
                userPeerInfo.userId       = userId;
                userPeerInfo.accessToken  = accessToken = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", "");
                userPeersByUserId[userId] = userPeerInfo;
                userPeers[connectionId]   = userPeerInfo;
                UpdateAccessTokenJob updateAccessTokenJob = new UpdateAccessTokenJob(Database, userId, accessToken);
                updateAccessTokenJob.Start();
                yield return(StartCoroutine(updateAccessTokenJob.WaitFor()));
            }
            ResponseUserLoginMessage responseMessage = new ResponseUserLoginMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseUserLoginMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            responseMessage.userId       = userId;
            responseMessage.accessToken  = accessToken;
            ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, MMOMessageTypes.ResponseUserLogin, responseMessage);
        }
Ejemplo n.º 21
0
        private async UniTaskVoid HandleRequestSelectCharacterRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            RequestSelectCharacterMessage message = messageHandler.ReadMessage <RequestSelectCharacterMessage>();

            ResponseSelectCharacterMessage.Error error = ResponseSelectCharacterMessage.Error.None;
            CentralServerPeerInfo mapServerPeerInfo    = default(CentralServerPeerInfo);
            CentralUserPeerInfo   userPeerInfo;

            if (!userPeers.TryGetValue(connectionId, out userPeerInfo))
            {
                error = ResponseSelectCharacterMessage.Error.NotLoggedin;
            }
            else
            {
                CharacterResp characterResp = await DbServiceClient.ReadCharacterAsync(new ReadCharacterReq()
                {
                    UserId      = userPeerInfo.userId,
                    CharacterId = message.characterId
                });

                PlayerCharacterData character = characterResp.CharacterData.FromByteString <PlayerCharacterData>();
                if (character == null)
                {
                    error = ResponseSelectCharacterMessage.Error.InvalidCharacterData;
                }
                else if (!mapServerPeersBySceneName.TryGetValue(character.CurrentMapName, out mapServerPeerInfo))
                {
                    error = ResponseSelectCharacterMessage.Error.MapNotReady;
                }
            }
            ResponseSelectCharacterMessage responseMessage = new ResponseSelectCharacterMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseSelectCharacterMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            if (error != ResponseSelectCharacterMessage.Error.MapNotReady)
            {
                responseMessage.sceneName      = mapServerPeerInfo.extra;
                responseMessage.networkAddress = mapServerPeerInfo.networkAddress;
                responseMessage.networkPort    = mapServerPeerInfo.networkPort;
            }
            ServerSendResponse(connectionId, MMOMessageTypes.ResponseSelectCharacter, responseMessage);
        }
Ejemplo n.º 22
0
        private async UniTaskVoid HandleRequestUserRegisterRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            RequestUserRegisterMessage message = messageHandler.ReadMessage <RequestUserRegisterMessage>();

            ResponseUserRegisterMessage.Error error = ResponseUserRegisterMessage.Error.None;
            string           username         = message.username;
            string           password         = message.password;
            FindUsernameResp findUsernameResp = await DbServiceClient.FindUsernameAsync(new FindUsernameReq()
            {
                Username = username
            });

            if (findUsernameResp.FoundAmount > 0)
            {
                error = ResponseUserRegisterMessage.Error.UsernameAlreadyExisted;
            }
            else if (string.IsNullOrEmpty(username) || username.Length < minUsernameLength)
            {
                error = ResponseUserRegisterMessage.Error.TooShortUsername;
            }
            else if (username.Length > maxUsernameLength)
            {
                error = ResponseUserRegisterMessage.Error.TooLongUsername;
            }
            else if (string.IsNullOrEmpty(password) || password.Length < minPasswordLength)
            {
                error = ResponseUserRegisterMessage.Error.TooShortPassword;
            }
            else
            {
                await DbServiceClient.CreateUserLoginAsync(new CreateUserLoginReq()
                {
                    Username = username,
                    Password = password
                });
            }
            ResponseUserRegisterMessage responseMessage = new ResponseUserRegisterMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseUserRegisterMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            ServerSendResponse(connectionId, MMOMessageTypes.ResponseUserRegister, responseMessage);
        }
Ejemplo n.º 23
0
        private IEnumerator HandleRequestSelectCharacterRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            RequestSelectCharacterMessage message = messageHandler.ReadMessage <RequestSelectCharacterMessage>();

            ResponseSelectCharacterMessage.Error error = ResponseSelectCharacterMessage.Error.None;
            CentralServerPeerInfo mapServerPeerInfo    = null;
            CentralUserPeerInfo   userPeerInfo;

            if (!userPeers.TryGetValue(connectionId, out userPeerInfo))
            {
                error = ResponseSelectCharacterMessage.Error.NotLoggedin;
            }
            else
            {
                ReadCharacterJob job = new ReadCharacterJob(Database, userPeerInfo.userId, message.characterId, false, false, false, false, false, false, false, false, false);
                job.Start();
                yield return(StartCoroutine(job.WaitFor()));

                PlayerCharacterData character = job.result;
                if (character == null)
                {
                    error = ResponseSelectCharacterMessage.Error.InvalidCharacterData;
                }
                else if (!mapServerPeersBySceneName.TryGetValue(character.CurrentMapName, out mapServerPeerInfo))
                {
                    error = ResponseSelectCharacterMessage.Error.MapNotReady;
                }
            }
            ResponseSelectCharacterMessage responseMessage = new ResponseSelectCharacterMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseSelectCharacterMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            if (mapServerPeerInfo != null)
            {
                responseMessage.sceneName      = mapServerPeerInfo.extra;
                responseMessage.networkAddress = mapServerPeerInfo.networkAddress;
                responseMessage.networkPort    = mapServerPeerInfo.networkPort;
                responseMessage.connectKey     = mapServerPeerInfo.connectKey;
            }
            ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, MMOMessageTypes.ResponseSelectCharacter, responseMessage);
        }
Ejemplo n.º 24
0
        private IEnumerator HandleRequestUserRegisterRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long connectionId = messageHandler.connectionId;
            RequestUserRegisterMessage message = messageHandler.ReadMessage <RequestUserRegisterMessage>();

            ResponseUserRegisterMessage.Error error = ResponseUserRegisterMessage.Error.None;
            string          username        = message.username;
            string          password        = message.password;
            FindUsernameJob findUsernameJob = new FindUsernameJob(Database, username);

            findUsernameJob.Start();
            yield return(StartCoroutine(findUsernameJob.WaitFor()));

            if (findUsernameJob.result > 0)
            {
                error = ResponseUserRegisterMessage.Error.UsernameAlreadyExisted;
            }
            else if (string.IsNullOrEmpty(username) || username.Length < minUsernameLength)
            {
                error = ResponseUserRegisterMessage.Error.TooShortUsername;
            }
            else if (username.Length > maxUsernameLength)
            {
                error = ResponseUserRegisterMessage.Error.TooLongUsername;
            }
            else if (string.IsNullOrEmpty(password) || password.Length < minPasswordLength)
            {
                error = ResponseUserRegisterMessage.Error.TooShortPassword;
            }
            else
            {
                CreateUserLoginJob createUserLoginJob = new CreateUserLoginJob(Database, username, password);
                createUserLoginJob.Start();
                yield return(StartCoroutine(createUserLoginJob.WaitFor()));
            }
            ResponseUserRegisterMessage responseMessage = new ResponseUserRegisterMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseUserRegisterMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, MMOMessageTypes.ResponseUserRegister, responseMessage);
        }
Ejemplo n.º 25
0
        private IEnumerator HandleRequestUserLogoutRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long                connectionId = messageHandler.connectionId;
            BaseAckMessage      message      = messageHandler.ReadMessage <BaseAckMessage>();
            CentralUserPeerInfo userPeerInfo;

            if (userPeers.TryGetValue(connectionId, out userPeerInfo))
            {
                userPeersByUserId.Remove(userPeerInfo.userId);
                userPeers.Remove(connectionId);
                UpdateAccessTokenJob updateAccessTokenJob = new UpdateAccessTokenJob(Database, userPeerInfo.userId, string.Empty);
                updateAccessTokenJob.Start();
                yield return(StartCoroutine(updateAccessTokenJob.WaitFor()));
            }
            BaseAckMessage responseMessage = new BaseAckMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = AckResponseCode.Success;
            ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, MMOMessageTypes.ResponseUserLogout, responseMessage);
        }
Ejemplo n.º 26
0
        private IEnumerator HandleRequestCashPackageInfoRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long           connectionId = messageHandler.connectionId;
            BaseAckMessage message      = messageHandler.ReadMessage <BaseAckMessage>();

            // Set response data
            ResponseCashPackageInfoMessage.Error error = ResponseCashPackageInfoMessage.Error.None;
            int        cash           = 0;
            List <int> cashPackageIds = new List <int>();
            BasePlayerCharacterEntity playerCharacter;
            UserCharacterData         userData;

            if (!playerCharacters.TryGetValue(connectionId, out playerCharacter) ||
                !usersById.TryGetValue(playerCharacter.Id, out userData))
            {
                error = ResponseCashPackageInfoMessage.Error.UserNotFound;
            }
            else
            {
                GetCashJob job = new GetCashJob(Database, userData.userId);
                job.Start();
                yield return(StartCoroutine(job.WaitFor()));

                cash = job.result;
                foreach (int cashShopItemId in GameInstance.CashPackages.Keys)
                {
                    cashPackageIds.Add(cashShopItemId);
                }
            }
            // Send response message
            ResponseCashPackageInfoMessage responseMessage = new ResponseCashPackageInfoMessage();

            responseMessage.ackId          = message.ackId;
            responseMessage.responseCode   = error == ResponseCashPackageInfoMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error          = error;
            responseMessage.cash           = cash;
            responseMessage.cashPackageIds = cashPackageIds.ToArray();
            ServerSendPacket(connectionId, SendOptions.ReliableOrdered, MsgTypes.CashPackageInfo, responseMessage);
        }
Ejemplo n.º 27
0
        private async UniTaskVoid HandleRequestUserLogoutRoutine(LiteNetLibMessageHandler messageHandler)
        {
            long                connectionId = messageHandler.connectionId;
            BaseAckMessage      message      = messageHandler.ReadMessage <BaseAckMessage>();
            CentralUserPeerInfo userPeerInfo;

            if (userPeers.TryGetValue(connectionId, out userPeerInfo))
            {
                userPeersByUserId.Remove(userPeerInfo.userId);
                userPeers.Remove(connectionId);
                await DbServiceClient.UpdateAccessTokenAsync(new UpdateAccessTokenReq()
                {
                    UserId      = userPeerInfo.userId,
                    AccessToken = string.Empty
                });
            }
            BaseAckMessage responseMessage = new BaseAckMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = AckResponseCode.Success;
            ServerSendResponse(connectionId, MMOMessageTypes.ResponseUserLogout, responseMessage);
        }
Ejemplo n.º 28
0
        private void HandleRequestSpawnMap(LiteNetLibMessageHandler messageHandler)
        {
            RequestSpawnMapMessage message = messageHandler.ReadMessage <RequestSpawnMapMessage>();

            ResponseSpawnMapMessage.Error error = ResponseSpawnMapMessage.Error.None;
            if (!CentralAppServerRegister.IsRegisteredToCentralServer)
            {
                error = ResponseSpawnMapMessage.Error.NotReady;
            }
            else if (string.IsNullOrEmpty(message.mapId))
            {
                error = ResponseSpawnMapMessage.Error.EmptySceneName;
            }

            if (error != ResponseSpawnMapMessage.Error.None)
            {
                ReponseMapSpawn(message.ackId, error);
            }
            else
            {
                SpawnMap(message, false);
            }
        }
Ejemplo n.º 29
0
        private IEnumerator HandleRequestDeleteCharacterRoutine(LiteNetLibMessageHandler messageHandler)
        {
            var connectionId = messageHandler.connectionId;
            var message      = messageHandler.ReadMessage <RequestDeleteCharacterMessage>();
            var error        = ResponseDeleteCharacterMessage.Error.None;
            CentralUserPeerInfo userPeerInfo;

            if (!userPeers.TryGetValue(connectionId, out userPeerInfo))
            {
                error = ResponseDeleteCharacterMessage.Error.NotLoggedin;
            }
            else
            {
                var job = new DeleteCharactersJob(Database, userPeerInfo.userId, message.characterId);
                job.Start();
                yield return(StartCoroutine(job.WaitFor()));
            }
            var responseMessage = new ResponseDeleteCharacterMessage();

            responseMessage.ackId        = message.ackId;
            responseMessage.responseCode = error == ResponseDeleteCharacterMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error;
            responseMessage.error        = error;
            ServerSendPacket(connectionId, SendOptions.ReliableOrdered, MMOMessageTypes.ResponseDeleteCharacter, responseMessage);
        }
        protected void HandleUpdateMapUser(LiteNetLibMessageHandler messageHandler)
        {
            var connectionId = messageHandler.connectionId;
            var message      = messageHandler.ReadMessage <UpdateUserCharacterMessage>();

            if (mapUserIds.ContainsKey(connectionId))
            {
                switch (message.type)
                {
                case UpdateUserCharacterMessage.UpdateType.Add:
                    if (!mapUserIds[connectionId].Contains(message.UserId))
                    {
                        mapUserIds[connectionId].Add(message.UserId);
                        Debug.Log("[Central] Add map user: "******" by " + connectionId);
                    }
                    break;

                case UpdateUserCharacterMessage.UpdateType.Remove:
                    mapUserIds[connectionId].Remove(message.UserId);
                    Debug.Log("[Central] Remove map user: "******" by " + connectionId);
                    break;
                }
            }
        }