public override async UniTask <bool> DeserializeClientReadyData(LiteNetLibIdentity playerIdentity, long connectionId, NetDataReader reader) { string userId = reader.GetString(); string accessToken = reader.GetString(); string selectCharacterId = reader.GetString(); if (ServerUserHandlers.TryGetPlayerCharacter(connectionId, out _)) { if (LogError) { Logging.LogError(LogTag, "User trying to hack: " + userId); } Transport.ServerDisconnect(connectionId); return(false); } ValidateAccessTokenResp validateAccessTokenResp = await DbServiceClient.ValidateAccessTokenAsync(new ValidateAccessTokenReq() { UserId = userId, AccessToken = accessToken }); if (!validateAccessTokenResp.IsPass) { if (LogError) { Logging.LogError(LogTag, "Invalid access token for user: "******"Not ready to spawn player: " + userId); } // Add to pending list to spawn player later when map server is ready to instantiate object pendingSpawnPlayerCharacters.Add(new PendingSpawnPlayerCharacter() { connectionId = connectionId, userId = userId, selectCharacterId = selectCharacterId }); return(false); } SetPlayerReadyRoutine(connectionId, userId, selectCharacterId).Forget(); return(true); }
private async UniTaskVoid OnPeerDisconnectedRoutine(long connectionId, DisconnectInfo disconnectInfo) { // Save player character data BasePlayerCharacterEntity playerCharacterEntity; if (ServerUserHandlers.TryGetPlayerCharacter(connectionId, out playerCharacterEntity)) { PlayerCharacterData saveCharacterData = playerCharacterEntity.CloneTo(new PlayerCharacterData()); while (savingCharacters.Contains(saveCharacterData.Id)) { await UniTask.Yield(); } await SaveCharacterRoutine(saveCharacterData, playerCharacterEntity.UserId); } UnregisterPlayerCharacter(connectionId); base.OnPeerDisconnected(connectionId, disconnectInfo); }
/// <summary> /// Warp to different map. /// </summary> /// <param name="playerCharacterEntity"></param> /// <param name="mapName"></param> /// <param name="position"></param> /// <param name="overrideRotation"></param> /// <param name="rotation"></param> /// <returns></returns> private async UniTaskVoid WarpCharacterRoutine(BasePlayerCharacterEntity playerCharacterEntity, string mapName, Vector3 position, bool overrideRotation, Vector3 rotation) { // If warping to different map long connectionId = playerCharacterEntity.ConnectionId; CentralServerPeerInfo peerInfo; BaseMapInfo mapInfo; if (!string.IsNullOrEmpty(mapName) && ServerUserHandlers.TryGetPlayerCharacter(connectionId, out _) && mapServerConnectionIdsBySceneName.TryGetValue(mapName, out peerInfo) && GameInstance.MapInfos.TryGetValue(mapName, out mapInfo) && mapInfo.IsSceneSet()) { // Add this character to warping list playerCharacterEntity.IsWarping = true; // Unregister player character UnregisterPlayerCharacter(connectionId); // Clone character data to save PlayerCharacterData savingCharacterData = new PlayerCharacterData(); playerCharacterEntity.CloneTo(savingCharacterData); savingCharacterData.CurrentMapName = mapName; savingCharacterData.CurrentPosition = position; if (overrideRotation) { savingCharacterData.CurrentRotation = rotation; } while (savingCharacters.Contains(savingCharacterData.Id)) { await UniTask.Yield(); } await SaveCharacterRoutine(savingCharacterData, playerCharacterEntity.UserId); // Remove this character from warping list playerCharacterEntity.IsWarping = false; // Destroy character from server playerCharacterEntity.NetworkDestroy(); // Send message to client to warp MMOWarpMessage message = new MMOWarpMessage(); message.networkAddress = peerInfo.networkAddress; message.networkPort = peerInfo.networkPort; ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, GameNetworkingConsts.Warp, message); } }
public override void UnregisterPlayerCharacter(long connectionId) { // Send remove character from map server BasePlayerCharacterEntity playerCharacter; SocialCharacterData userData; if (ServerUserHandlers.TryGetPlayerCharacter(connectionId, out playerCharacter) && usersById.TryGetValue(playerCharacter.Id, out userData)) { usersById.TryRemove(playerCharacter.Id, out _); // Remove map user from central server and chat server UpdateMapUser(CentralAppServerRegister, UpdateUserCharacterMessage.UpdateType.Remove, userData); if (ChatNetworkManager.IsClientConnected) { UpdateMapUser(ChatNetworkManager.Client, UpdateUserCharacterMessage.UpdateType.Remove, userData); } } base.UnregisterPlayerCharacter(connectionId); }
private async UniTaskVoid WarpCharacterToInstanceRoutine(BasePlayerCharacterEntity playerCharacterEntity, string instanceId) { // If warping to different map long connectionId = playerCharacterEntity.ConnectionId; CentralServerPeerInfo peerInfo; InstanceMapWarpingLocation warpingLocation; BaseMapInfo mapInfo; if (ServerUserHandlers.TryGetPlayerCharacter(connectionId, out _) && instanceMapWarpingLocations.TryGetValue(instanceId, out warpingLocation) && instanceMapServerConnectionIdsByInstanceId.TryGetValue(instanceId, out peerInfo) && GameInstance.MapInfos.TryGetValue(warpingLocation.mapName, out mapInfo) && mapInfo.IsSceneSet()) { // Add this character to warping list playerCharacterEntity.IsWarping = true; // Unregister player character UnregisterPlayerCharacter(connectionId); // Clone character data to save PlayerCharacterData savingCharacterData = new PlayerCharacterData(); playerCharacterEntity.CloneTo(savingCharacterData); // Wait to save character before move to instance map while (savingCharacters.Contains(savingCharacterData.Id)) { await UniTask.Yield(); } await SaveCharacterRoutine(savingCharacterData, playerCharacterEntity.UserId); // Remove this character from warping list playerCharacterEntity.IsWarping = false; // Destroy character from server playerCharacterEntity.NetworkDestroy(); // Send message to client to warp MMOWarpMessage message = new MMOWarpMessage(); message.networkAddress = peerInfo.networkAddress; message.networkPort = peerInfo.networkPort; ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, GameNetworkingConsts.Warp, message); } }