protected async UniTaskVoid HandleRequestSelectCharacter( RequestHandlerData requestHandler, RequestSelectCharacterMessage request, RequestProceedResultDelegate <ResponseSelectCharacterMessage> result) { #if UNITY_STANDALONE && !CLIENT_BUILD long connectionId = requestHandler.ConnectionId; CentralServerPeerInfo mapServerPeerInfo = default; CentralUserPeerInfo userPeerInfo; if (!userPeers.TryGetValue(connectionId, out userPeerInfo)) { result.InvokeError(new ResponseSelectCharacterMessage() { message = UITextKeys.UI_ERROR_NOT_LOGGED_IN, }); return; } AsyncResponseData <CharacterResp> characterResp = await DbServiceClient.ReadCharacterAsync(new ReadCharacterReq() { UserId = userPeerInfo.userId, CharacterId = request.characterId }); if (!characterResp.IsSuccess) { result.InvokeError(new ResponseSelectCharacterMessage() { message = UITextKeys.UI_ERROR_INTERNAL_SERVER_ERROR, }); return; } PlayerCharacterData character = characterResp.Response.CharacterData; if (character == null) { result.InvokeError(new ResponseSelectCharacterMessage() { message = UITextKeys.UI_ERROR_INVALID_CHARACTER_DATA, }); return; } if (!ClusterServer.MapServerPeersByMapId.TryGetValue(character.CurrentMapName, out mapServerPeerInfo)) { result.InvokeError(new ResponseSelectCharacterMessage() { message = UITextKeys.UI_ERROR_MAP_SERVER_NOT_READY, }); return; } // Response result.InvokeSuccess(new ResponseSelectCharacterMessage() { sceneName = mapServerPeerInfo.extra, networkAddress = mapServerPeerInfo.networkAddress, networkPort = mapServerPeerInfo.networkPort, }); #endif }
protected async UniTaskVoid HandleRequestSelectCharacter( RequestHandlerData requestHandler, RequestSelectCharacterMessage request, RequestProceedResultDelegate <ResponseSelectCharacterMessage> result) { long connectionId = requestHandler.ConnectionId; ResponseSelectCharacterMessage.Error error = ResponseSelectCharacterMessage.Error.None; CentralServerPeerInfo mapServerPeerInfo = default; CentralUserPeerInfo userPeerInfo; if (!userPeers.TryGetValue(connectionId, out userPeerInfo)) { error = ResponseSelectCharacterMessage.Error.NotLoggedin; } else { CharacterResp characterResp = await DbServiceClient.ReadCharacterAsync(new ReadCharacterReq() { UserId = userPeerInfo.userId, CharacterId = request.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; } } AckResponseCode responseCode = error == ResponseSelectCharacterMessage.Error.None ? AckResponseCode.Success : AckResponseCode.Error; ResponseSelectCharacterMessage response = new ResponseSelectCharacterMessage(); response.error = error; if (error != ResponseSelectCharacterMessage.Error.MapNotReady) { response.sceneName = mapServerPeerInfo.extra; response.networkAddress = mapServerPeerInfo.networkAddress; response.networkPort = mapServerPeerInfo.networkPort; } // Response result.Invoke(responseCode, response); }
protected async UniTaskVoid HandleRequestSelectCharacter( RequestHandlerData requestHandler, RequestSelectCharacterMessage request, RequestProceedResultDelegate <ResponseSelectCharacterMessage> result) { #if UNITY_STANDALONE && !CLIENT_BUILD long connectionId = requestHandler.ConnectionId; UITextKeys message = UITextKeys.NONE; CentralServerPeerInfo mapServerPeerInfo = default; CentralUserPeerInfo userPeerInfo; if (!userPeers.TryGetValue(connectionId, out userPeerInfo)) { message = UITextKeys.UI_ERROR_NOT_LOGGED_IN; } else { CharacterResp characterResp = await DbServiceClient.ReadCharacterAsync(new ReadCharacterReq() { UserId = userPeerInfo.userId, CharacterId = request.characterId }); PlayerCharacterData character = characterResp.CharacterData; if (character == null) { message = UITextKeys.UI_ERROR_INVALID_CHARACTER_DATA; } else if (!mapServerPeersBySceneName.TryGetValue(character.CurrentMapName, out mapServerPeerInfo)) { message = UITextKeys.UI_ERROR_MAP_SERVER_NOT_READY; } } AckResponseCode responseCode = message == UITextKeys.NONE ? AckResponseCode.Success : AckResponseCode.Error; ResponseSelectCharacterMessage response = new ResponseSelectCharacterMessage(); response.message = message; if (message != UITextKeys.UI_ERROR_MAP_SERVER_NOT_READY) { response.sceneName = mapServerPeerInfo.extra; response.networkAddress = mapServerPeerInfo.networkAddress; response.networkPort = mapServerPeerInfo.networkPort; } // Response result.Invoke(responseCode, response); #endif }
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); }
private async UniTaskVoid SetPlayerReadyRoutine(long connectionId, string userId, string selectCharacterId) { CharacterResp characterResp = await DbServiceClient.ReadCharacterAsync(new ReadCharacterReq() { UserId = userId, CharacterId = selectCharacterId }); PlayerCharacterData playerCharacterData = characterResp.CharacterData; // If data is empty / cannot find character, disconnect user if (playerCharacterData == null) { if (LogError) { Logging.LogError(LogTag, "Cannot find select character: " + selectCharacterId + " for user: "******"Cannot find player character with entity Id: " + playerCharacterData.EntityId); } Transport.ServerDisconnect(connectionId); } else { // Prepare saving location for this character string savingCurrentMapName = playerCharacterData.CurrentMapName; Vector3 savingCurrentPosition = playerCharacterData.CurrentPosition; if (IsInstanceMap()) { playerCharacterData.CurrentPosition = MapInstanceWarpToPosition; if (MapInstanceWarpOverrideRotation) { playerCharacterData.CurrentRotation = MapInstanceWarpToRotation; } } // Spawn character entity and set its data Quaternion characterRotation = Quaternion.identity; if (CurrentGameInstance.DimensionType == DimensionType.Dimension3D) { characterRotation = Quaternion.Euler(playerCharacterData.CurrentRotation); } GameObject spawnObj = Instantiate(entityPrefab.gameObject, playerCharacterData.CurrentPosition, characterRotation); BasePlayerCharacterEntity playerCharacterEntity = spawnObj.GetComponent <BasePlayerCharacterEntity>(); playerCharacterData.CloneTo(playerCharacterEntity); Assets.NetworkSpawn(spawnObj, 0, connectionId); // Set currencies // Gold GoldResp getGoldResp = await DbServiceClient.GetGoldAsync(new GetGoldReq() { UserId = userId }); playerCharacterEntity.UserGold = getGoldResp.Gold; // Cash CashResp getCashResp = await DbServiceClient.GetCashAsync(new GetCashReq() { UserId = userId }); playerCharacterEntity.UserCash = getCashResp.Cash; // Prepare saving location for this character if (IsInstanceMap()) { instanceMapCurrentLocations.TryAdd(playerCharacterEntity.ObjectId, new KeyValuePair <string, Vector3>(savingCurrentMapName, savingCurrentPosition)); } // Set user Id playerCharacterEntity.UserId = userId; // Load user level GetUserLevelResp getUserLevelResp = await DbServiceClient.GetUserLevelAsync(new GetUserLevelReq() { UserId = userId }); playerCharacterEntity.UserLevel = getUserLevelResp.UserLevel; // Load party data, if this map-server does not have party data if (playerCharacterEntity.PartyId > 0) { if (!ServerPartyHandlers.ContainsParty(playerCharacterEntity.PartyId)) { await LoadPartyRoutine(playerCharacterEntity.PartyId); } PartyData party; if (ServerPartyHandlers.TryGetParty(playerCharacterEntity.PartyId, out party)) { ServerGameMessageHandlers.SendSetPartyData(playerCharacterEntity.ConnectionId, party); ServerGameMessageHandlers.SendAddPartyMembersToOne(playerCharacterEntity.ConnectionId, party); } else { playerCharacterEntity.ClearParty(); } } // Load guild data, if this map-server does not have guild data if (playerCharacterEntity.GuildId > 0) { if (!ServerGuildHandlers.ContainsGuild(playerCharacterEntity.GuildId)) { await LoadGuildRoutine(playerCharacterEntity.GuildId); } GuildData guild; if (ServerGuildHandlers.TryGetGuild(playerCharacterEntity.GuildId, out guild)) { playerCharacterEntity.GuildName = guild.guildName; playerCharacterEntity.GuildRole = guild.GetMemberRole(playerCharacterEntity.Id); ServerGameMessageHandlers.SendSetGuildData(playerCharacterEntity.ConnectionId, guild); ServerGameMessageHandlers.SendAddGuildMembersToOne(playerCharacterEntity.ConnectionId, guild); ServerGameMessageHandlers.SendSetGuildMessage(playerCharacterEntity.ConnectionId, guild); ServerGameMessageHandlers.SendSetGuildRolesToOne(playerCharacterEntity.ConnectionId, guild); ServerGameMessageHandlers.SendSetGuildMemberRolesToOne(playerCharacterEntity.ConnectionId, guild); ServerGameMessageHandlers.SendSetGuildSkillLevelsToOne(playerCharacterEntity.ConnectionId, guild); ServerGameMessageHandlers.SendSetGuildGold(playerCharacterEntity.ConnectionId, guild); ServerGameMessageHandlers.SendSetGuildLevelExpSkillPoint(playerCharacterEntity.ConnectionId, guild); } else { playerCharacterEntity.ClearGuild(); } } // Summon saved summons for (int i = 0; i < playerCharacterEntity.Summons.Count; ++i) { CharacterSummon summon = playerCharacterEntity.Summons[i]; summon.Summon(playerCharacterEntity, summon.Level, summon.summonRemainsDuration, summon.Exp, summon.CurrentHp, summon.CurrentMp); playerCharacterEntity.Summons[i] = summon; } // Summon saved mount entity if (GameInstance.VehicleEntities.ContainsKey(playerCharacterData.MountDataId)) { playerCharacterEntity.Mount(GameInstance.VehicleEntities[playerCharacterData.MountDataId]); } // Force make caches, to calculate current stats to fill empty slots items playerCharacterEntity.ForceMakeCaches(); playerCharacterEntity.FillEmptySlots(); // Notify clients that this character is spawn or dead if (!playerCharacterEntity.IsDead()) { playerCharacterEntity.CallAllOnRespawn(); } else { playerCharacterEntity.CallAllOnDead(); } // Register player character entity to the server RegisterPlayerCharacter(connectionId, playerCharacterEntity); } } }