public void Construct(AvatarSpawner avatarSpawner, IAvatarProvider <AvatarPrefab> avatarProvider, [InjectOptional] IConnectedPlayer connectedPlayer, CustomAvatarManager customAvatarManager) { _avatarSpawner = avatarSpawner; _avatarProvider = avatarProvider; _connectedPlayer = connectedPlayer; _customAvatarManager = customAvatarManager; }
IEnumerator InitializeAvatarController() { if (!defaultAvatarInstance.IsLoaded) { Logger.Debug("Waiting for avatar to load"); yield return(new WaitWhile(delegate() { return !defaultAvatarInstance.IsLoaded; })); } else { yield return(null); } Logger.Debug("Spawning avatar"); _centerAdjust = FindObjectOfType <VRCenterAdjust>(); avatar = AvatarSpawner.SpawnAvatar(defaultAvatarInstance, this); playerNameText = CreateWorldText(transform, "Loading"); playerNameText.rectTransform.anchoredPosition3D = new Vector3(0f, 0.25f, 0f); playerNameText.alignment = TextAlignmentOptions.Center; playerNameText.fontSize = 2.5f; avatar.GameObject.transform.SetParent(_centerAdjust.transform, false); transform.SetParent(_centerAdjust.transform, false); }
internal PlayerAvatarManager(DiContainer container, ILogger <PlayerAvatarManager> logger, AvatarLoader avatarLoader, Settings settings, AvatarSpawner spawner, BeatSaberUtilities beatSaberUtilities) { _container = container; _logger = logger; _avatarLoader = avatarLoader; _settings = settings; _spawner = spawner; _beatSaberUtilities = beatSaberUtilities; }
private PlayerAvatarManager(DiContainer container, ILoggerProvider loggerProvider, AvatarLoader avatarLoader, Settings settings, AvatarSpawner spawner, BeatSaberUtilities beatSaberUtilities, FloorController floorController) { _container = container; _logger = loggerProvider.CreateLogger <PlayerAvatarManager>(); _avatarLoader = avatarLoader; _settings = settings; _spawner = spawner; _beatSaberUtilities = beatSaberUtilities; _floorController = floorController; }
private PlayerAvatarManager(DiContainer container, ILoggerProvider loggerProvider, AvatarLoader avatarLoader, Settings settings, AvatarSpawner spawner, BeatSaberUtilities beatSaberUtilities, FloorController floorController) { _container = container; _logger = loggerProvider.CreateLogger <PlayerAvatarManager>(); _avatarLoader = avatarLoader; _settings = settings; _spawner = spawner; _beatSaberUtilities = beatSaberUtilities; _floorController = floorController; _fileSystemWatcher = new FileSystemWatcher(kCustomAvatarsPath, "*.avatar"); _fileSystemWatcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.Size; }
IEnumerator InitializeAvatarController() { if (!defaultAvatarInstance.IsLoaded) { #if DEBUG Plugin.log.Info("Waiting for avatar to load"); #endif yield return(new WaitWhile(delegate() { return !defaultAvatarInstance.IsLoaded; })); } else { yield return(null); } #if DEBUG Plugin.log.Info("Spawning avatar"); #endif centerAdjust = FindObjectOfType <VRCenterAdjust>(); avatar = AvatarSpawner.SpawnAvatar(defaultAvatarInstance, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } playerNameText = CustomExtensions.CreateWorldText(transform, "INVALID"); playerNameText.rectTransform.anchoredPosition3D = new Vector3(0f, 0.25f, 0f); playerNameText.alignment = TextAlignmentOptions.Center; playerNameText.fontSize = 2.5f; playerSpeakerIcon = new GameObject("Player Speaker Icon", typeof(Canvas), typeof(CanvasRenderer)).AddComponent <Image>(); playerSpeakerIcon.GetComponent <Canvas>().renderMode = RenderMode.WorldSpace; playerSpeakerIcon.rectTransform.SetParent(transform); playerSpeakerIcon.rectTransform.localScale = new Vector3(0.004f, 0.004f, 1f); playerSpeakerIcon.rectTransform.pivot = new Vector2(0.5f, 0.5f); playerSpeakerIcon.rectTransform.anchoredPosition3D = new Vector3(0f, 0.65f, 0f); playerSpeakerIcon.sprite = Sprites.speakerIcon; avatar.GameObject.transform.SetParent(centerAdjust.transform, false); transform.SetParent(centerAdjust.transform, false); if (ModelSaberAPI.cachedAvatars.Any(x => x.Value == avatar.CustomAvatar)) { currentAvatarHash = ModelSaberAPI.cachedAvatars.First(x => x.Value == avatar.CustomAvatar).Key; } else { currentAvatarHash = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"; } }
private void AvatarDownloaded(string hash, CustomAvatar.CustomAvatar downloadedAvatar) { if (ModelSaberAPI.cachedAvatars.First(x => x.Value == avatar.CustomAvatar).Key != playerInfo.avatarHash && playerInfo.avatarHash == hash) { ModelSaberAPI.avatarDownloaded -= AvatarDownloaded; if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(downloadedAvatar, this); } }
private void AvatarDownloaded(string hash) { if (this != null && ModelSaberAPI.cachedAvatars.First(x => x.Value == avatar.CustomAvatar).Key != playerInfo.avatarHash && playerInfo.avatarHash == hash) { ModelSaberAPI.avatarDownloaded -= AvatarDownloaded; if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(ModelSaberAPI.cachedAvatars[hash], this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } currentAvatarHash = hash; } }
private void AvatarDownloaded(string hash) { if (this != null && (!ModelSaberAPI.cachedAvatars.ContainsValue(avatar.CustomAvatar) || ModelSaberAPI.cachedAvatars.First(x => x.Value == avatar.CustomAvatar).Key != playerAvatarHash) && playerAvatarHash == hash) { Plugin.log.Debug($"Avatar with hash \"{hash}\" loaded! (2)"); ModelSaberAPI.avatarDownloaded -= AvatarDownloaded; if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(ModelSaberAPI.cachedAvatars[hash], this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } currentAvatarHash = hash; } }
IEnumerator InitializeReplayManager() { if (!defaultAvatar.IsLoaded) { Logger.Debug("Waiting for avatar to load"); yield return(new WaitWhile(delegate() { return !defaultAvatar.IsLoaded; })); } else { yield return(null); } Logger.Debug("Spawning avatar"); _centerAdjust = FindObjectOfType <VRCenterAdjust>(); avatar = AvatarSpawner.SpawnAvatar(defaultAvatar, this); avatar.GameObject.transform.SetParent(_centerAdjust.transform, false); transform.SetParent(_centerAdjust.transform, false); InvokeRepeating("MovementPlay", 0f, UPDATE_INTERVAL); }
IEnumerator InitializeAvatarController() { if (!defaultAvatarInstance.IsLoaded) { #if DEBUG Misc.Logger.Info("Waiting for avatar to load"); #endif yield return(new WaitWhile(delegate() { return !defaultAvatarInstance.IsLoaded; })); } else { yield return(null); } #if DEBUG Misc.Logger.Info("Spawning avatar"); #endif _centerAdjust = FindObjectOfType <VRCenterAdjust>(); avatar = AvatarSpawner.SpawnAvatar(defaultAvatarInstance, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } playerNameText = CustomExtensions.CreateWorldText(transform, "INVALID"); playerNameText.rectTransform.anchoredPosition3D = new Vector3(0f, 0.25f, 0f); playerNameText.alignment = TextAlignmentOptions.Center; playerNameText.fontSize = 2.5f; avatar.GameObject.transform.SetParent(_centerAdjust.transform, false); transform.SetParent(_centerAdjust.transform, false); currentAvatarHash = ModelSaberAPI.cachedAvatars.First(x => x.Value == avatar.CustomAvatar).Key; }
public void SetPlayerPacket(PlayerPacket _playerInfo, Vector3 offsetVector, bool isLocal) { if (_playerInfo == null) { playerNameText.gameObject.SetActive(false); if (rendererEnabled) { SetRendererInChilds(avatar.GameObject.transform, false); rendererEnabled = false; } return; } try { playerInfo = _playerInfo; if (!playerNameText) { return; } if (avatar == null || ModelSaberAPI.cachedAvatars.First(x => x.Value == avatar.CustomAvatar).Key != playerInfo.avatarHash) { if (ModelSaberAPI.cachedAvatars.ContainsKey(playerInfo.avatarHash)) { if (ModelSaberAPI.cachedAvatars[playerInfo.avatarHash].IsLoaded) { if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(ModelSaberAPI.cachedAvatars[playerInfo.avatarHash], this); } else if (!pendingAvatars.Contains(ModelSaberAPI.cachedAvatars[playerInfo.avatarHash])) { pendingAvatars.Add(ModelSaberAPI.cachedAvatars[playerInfo.avatarHash]); ModelSaberAPI.cachedAvatars[playerInfo.avatarHash].Load((CustomAvatar.CustomAvatar loadedAvatar, AvatarLoadResult result) => { if (result == AvatarLoadResult.Completed) { pendingAvatars.Remove(ModelSaberAPI.cachedAvatars[playerInfo.avatarHash]); AvatarLoaded?.Invoke(ModelSaberAPI.cachedAvatars.First(x => x.Value == avatar.CustomAvatar).Key, loadedAvatar); } }); AvatarLoaded += AvatarController_AvatarLoaded; } else { AvatarLoaded -= AvatarController_AvatarLoaded; AvatarLoaded += AvatarController_AvatarLoaded; } } else { if (ModelSaberAPI.queuedAvatars.Contains(playerInfo.avatarHash)) { ModelSaberAPI.avatarDownloaded += AvatarDownloaded; } else { SharedCoroutineStarter.instance.StartCoroutine(ModelSaberAPI.DownloadAvatarCoroutine(playerInfo.avatarHash, (CustomAvatar.CustomAvatar avatar) => { AvatarDownloaded(playerInfo.avatarHash, avatar); })); } } } if (isLocal) { playerNameText.gameObject.SetActive(false); #if !DEBUG if (rendererEnabled) { SetRendererInChilds(avatar.GameObject.transform, false); rendererEnabled = false; } #endif } else { playerNameText.gameObject.SetActive(true); if (!rendererEnabled) { SetRendererInChilds(avatar.GameObject.transform, true); rendererEnabled = true; } } interpolationProgress = 0f; lastHeadPos = targetHeadPos; targetHeadPos = _playerInfo.headPos + offsetVector; lastRightHandPos = targetRightHandPos; targetRightHandPos = _playerInfo.rightHandPos + offsetVector; lastLeftHandPos = targetLeftHandPos; targetLeftHandPos = _playerInfo.leftHandPos + offsetVector; lastHeadRot = targetHeadRot; targetHeadRot = _playerInfo.headRot; lastRightHandRot = targetRightHandRot; targetRightHandRot = _playerInfo.rightHandRot; lastLeftHandRot = targetLeftHandRot; targetLeftHandRot = _playerInfo.leftHandRot; playerNameText.text = playerInfo.playerName; if (forcePlayerPacket) { interpHeadPos = targetHeadPos; interpLeftHandPos = targetLeftHandPos; interpRightHandPos = targetRightHandPos; interpHeadRot = targetHeadRot; interpLeftHandRot = targetLeftHandRot; interpRightHandRot = targetRightHandRot; transform.position = interpHeadPos; } } catch (Exception e) { Logger.Error($"Avatar controller exception: {_playerInfo.playerName}: {e}"); } }
public void SetPlayerInfo(PlayerInfo _playerInfo, float offset, bool isLocal) { if (_playerInfo == default) { if (playerNameText != null) { playerNameText.gameObject.SetActive(false); } if (playerSpeakerIcon != null) { playerSpeakerIcon.gameObject.SetActive(false); } if (avatar != null && avatar.GameObject != null) { Destroy(avatar.GameObject); } return; } try { playerInfo = _playerInfo.updateInfo; playerId = _playerInfo.playerId; playerAvatarHash = _playerInfo.avatarHash; playerName = _playerInfo.playerName; if (playerNameText != null && playerSpeakerIcon != null) { if (isLocal) { playerNameText.gameObject.SetActive(false); playerSpeakerIcon.gameObject.SetActive(false); #if !DEBUG if (avatar != null) { Destroy(avatar.GameObject); } #endif } else { playerNameText.gameObject.SetActive(true); playerNameText.alignment = TextAlignmentOptions.Center; playerSpeakerIcon.gameObject.SetActive(InGameOnlineController.Instance.VoiceChatIsTalking(playerId)); } } else { return; } #if !DEBUG if ((avatar == null || currentAvatarHash != playerAvatarHash) && !isLocal) #else if ((avatar == null || currentAvatarHash != playerAvatarHash)) #endif { if (ModelSaberAPI.cachedAvatars.ContainsKey(playerAvatarHash)) { CustomAvatar.CustomAvatar cachedAvatar = ModelSaberAPI.cachedAvatars[playerAvatarHash]; if (cachedAvatar != null) { if (pendingAvatars.Contains(cachedAvatar)) { AvatarLoaded -= AvatarController_AvatarLoaded; AvatarLoaded += AvatarController_AvatarLoaded; } else if (!pendingAvatars.Contains(cachedAvatar) && !cachedAvatar.IsLoaded) { if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(defaultAvatarInstance, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } pendingAvatars.Add(cachedAvatar); AvatarLoaded -= AvatarController_AvatarLoaded; AvatarLoaded += AvatarController_AvatarLoaded; cachedAvatar.Load((CustomAvatar.CustomAvatar loadedAvatar, AvatarLoadResult result) => { if (result == AvatarLoadResult.Completed) { pendingAvatars.Remove(ModelSaberAPI.cachedAvatars[playerAvatarHash]); AvatarLoaded?.Invoke(ModelSaberAPI.cachedAvatars.First(x => x.Value == loadedAvatar).Key); } }); } else { if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(cachedAvatar, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } currentAvatarHash = playerAvatarHash; } } } else { if (Config.Instance.DownloadAvatars) { if (ModelSaberAPI.queuedAvatars.Contains(playerAvatarHash)) { ModelSaberAPI.avatarDownloaded -= AvatarDownloaded; ModelSaberAPI.avatarDownloaded += AvatarDownloaded; } else { ModelSaberAPI.avatarDownloaded -= AvatarDownloaded; ModelSaberAPI.avatarDownloaded += AvatarDownloaded; SharedCoroutineStarter.instance.StartCoroutine(ModelSaberAPI.DownloadAvatarCoroutine(playerAvatarHash)); if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(defaultAvatarInstance, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } } } } } Vector3 offsetVector = new Vector3(offset, 0f, 0f); HeadPos = playerInfo.headPos + offsetVector; RightHandPos = playerInfo.rightHandPos + offsetVector; LeftHandPos = playerInfo.leftHandPos + offsetVector; HeadRot = playerInfo.headRot; RightHandRot = playerInfo.rightHandRot; LeftHandRot = playerInfo.leftHandRot; if (playerInfo.fullBodyTracking) { RightLegPos = playerInfo.rightLegPos + offsetVector; LeftLegPos = playerInfo.leftLegPos + offsetVector; PelvisPos = playerInfo.pelvisPos + offsetVector; RightLegRot = playerInfo.rightLegRot; LeftLegRot = playerInfo.leftLegRot; PelvisRot = playerInfo.pelvisRot; } else { RightLegPos = new Vector3(); LeftLegPos = new Vector3(); PelvisPos = new Vector3(); RightLegRot = new Quaternion(); LeftLegRot = new Quaternion(); PelvisRot = new Quaternion(); } transform.position = HeadPos; playerNameText.text = playerName; if (playerInfo.playerFlags.rainbowName && !rainbowName) { playerNameText.color = playerInfo.playerNameColor; nameColor = HSBColor.FromColor(playerInfo.playerNameColor); } else if (!playerInfo.playerFlags.rainbowName && playerNameText.color != playerInfo.playerNameColor) { playerNameText.color = playerInfo.playerNameColor; } rainbowName = playerInfo.playerFlags.rainbowName; } catch (Exception e) { Plugin.log.Critical(e); } }
public void SetPlayerInfo(PlayerInfo _playerInfo, float offset, bool isLocal) { if (_playerInfo == null) { if (playerNameText != null) { playerNameText.gameObject.SetActive(false); } if (playerSpeakerIcon != null) { playerSpeakerIcon.gameObject.SetActive(false); } if (avatar != null) { Destroy(avatar.GameObject); } return; } try { playerInfo = _playerInfo; if (playerNameText != null && playerSpeakerIcon != null) { if (isLocal) { playerNameText.gameObject.SetActive(false); playerSpeakerIcon.gameObject.SetActive(false); #if !DEBUG if (avatar != null) { Destroy(avatar.GameObject); } #endif } else { playerNameText.gameObject.SetActive(true); playerNameText.alignment = TextAlignmentOptions.Center; playerSpeakerIcon.gameObject.SetActive(InGameOnlineController.Instance.VoiceChatIsTalking(playerInfo.playerId)); } } if (playerNameText == null || playerSpeakerIcon == null) { return; } if ((avatar == null || currentAvatarHash != playerInfo.avatarHash) && !isLocal) { if (ModelSaberAPI.cachedAvatars.ContainsKey(playerInfo.avatarHash)) { CustomAvatar.CustomAvatar cachedAvatar = ModelSaberAPI.cachedAvatars[playerInfo.avatarHash]; if (cachedAvatar != null) { if (pendingAvatars.Contains(cachedAvatar)) { AvatarLoaded -= AvatarController_AvatarLoaded; AvatarLoaded += AvatarController_AvatarLoaded; } else if (!pendingAvatars.Contains(cachedAvatar) && !cachedAvatar.IsLoaded) { if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(defaultAvatarInstance, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } pendingAvatars.Add(cachedAvatar); cachedAvatar.Load((CustomAvatar.CustomAvatar loadedAvatar, AvatarLoadResult result) => { if (result == AvatarLoadResult.Completed) { pendingAvatars.Remove(ModelSaberAPI.cachedAvatars[playerInfo.avatarHash]); AvatarLoaded?.Invoke(ModelSaberAPI.cachedAvatars.First(x => x.Value == loadedAvatar).Key); } }); AvatarLoaded += AvatarController_AvatarLoaded; } else { if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(cachedAvatar, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } currentAvatarHash = playerInfo.avatarHash; } } } else { if (Config.Instance.DownloadAvatars) { if (ModelSaberAPI.queuedAvatars.Contains(playerInfo.avatarHash)) { ModelSaberAPI.avatarDownloaded += AvatarDownloaded; } else { SharedCoroutineStarter.instance.StartCoroutine(ModelSaberAPI.DownloadAvatarCoroutine(playerInfo.avatarHash, (string hash) => { AvatarDownloaded(hash); })); if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(defaultAvatarInstance, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } } } } } Vector3 offsetVector = new Vector3(offset, 0f, 0f); HeadPos = playerInfo.headPos + offsetVector; RightHandPos = playerInfo.rightHandPos + offsetVector; LeftHandPos = playerInfo.leftHandPos + offsetVector; HeadRot = playerInfo.headRot; RightHandRot = playerInfo.rightHandRot; LeftHandRot = playerInfo.leftHandRot; transform.position = HeadPos; playerNameText.text = playerInfo.playerName; playerNameText.color = playerInfo.playerNameColor; } catch (Exception e) { Misc.Logger.Exception($"Avatar controller exception: {playerInfo.playerName}: {e}"); } }
public void SetPlayerInfo(PlayerInfo _playerInfo, float offset, bool isLocal) { if (_playerInfo == null) { playerNameText.gameObject.SetActive(false); if (rendererEnabled) { SetRendererInChilds(avatar.GameObject.transform, false); rendererEnabled = false; } return; } try { playerInfo = _playerInfo; if (playerNameText == null) { return; } if (avatar == null || currentAvatarHash != playerInfo.avatarHash) { if (ModelSaberAPI.cachedAvatars.ContainsKey(playerInfo.avatarHash)) { CustomAvatar.CustomAvatar cachedAvatar = ModelSaberAPI.cachedAvatars[playerInfo.avatarHash]; if (cachedAvatar != null) { if (cachedAvatar.IsLoaded) { if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(cachedAvatar, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } currentAvatarHash = playerInfo.avatarHash; } else if (!pendingAvatars.Contains(cachedAvatar)) { if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(defaultAvatarInstance, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } pendingAvatars.Add(cachedAvatar); cachedAvatar.Load((CustomAvatar.CustomAvatar loadedAvatar, AvatarLoadResult result) => { if (result == AvatarLoadResult.Completed) { pendingAvatars.Remove(ModelSaberAPI.cachedAvatars[playerInfo.avatarHash]); AvatarLoaded?.Invoke(ModelSaberAPI.cachedAvatars.First(x => x.Value == loadedAvatar).Key); } }); AvatarLoaded += AvatarController_AvatarLoaded; } else { if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(defaultAvatarInstance, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } AvatarLoaded -= AvatarController_AvatarLoaded; AvatarLoaded += AvatarController_AvatarLoaded; } } } else { if (Config.Instance.DownloadAvatars) { if (avatar != null) { Destroy(avatar.GameObject); } avatar = AvatarSpawner.SpawnAvatar(defaultAvatarInstance, this); exclusionScript = avatar.GameObject.GetComponentsInChildren <AvatarScriptPack.FirstPersonExclusion>().FirstOrDefault(); if (exclusionScript != null) { exclusionScript.SetVisible(); } if (ModelSaberAPI.queuedAvatars.Contains(playerInfo.avatarHash)) { ModelSaberAPI.avatarDownloaded += AvatarDownloaded; } else { SharedCoroutineStarter.instance.StartCoroutine(ModelSaberAPI.DownloadAvatarCoroutine(playerInfo.avatarHash, (string hash) => { AvatarDownloaded(hash); })); } } } } if (isLocal) { playerNameText.gameObject.SetActive(false); #if !DEBUG if (rendererEnabled) { SetRendererInChilds(avatar.GameObject.transform, false); rendererEnabled = false; } #endif } else { playerNameText.gameObject.SetActive(true); if (!rendererEnabled) { SetRendererInChilds(avatar.GameObject.transform, true); rendererEnabled = true; } } interpolationProgress = 0f; Vector3 offsetVector = new Vector3(offset, 0f, 0f); lastHeadPos = targetHeadPos; targetHeadPos = _playerInfo.headPos + offsetVector; lastRightHandPos = targetRightHandPos; targetRightHandPos = _playerInfo.rightHandPos + offsetVector; lastLeftHandPos = targetLeftHandPos; targetLeftHandPos = _playerInfo.leftHandPos + offsetVector; lastHeadRot = targetHeadRot; targetHeadRot = _playerInfo.headRot; lastRightHandRot = targetRightHandRot; targetRightHandRot = _playerInfo.rightHandRot; lastLeftHandRot = targetLeftHandRot; targetLeftHandRot = _playerInfo.leftHandRot; playerNameText.text = playerInfo.playerName; if (forcePlayerInfo) { interpHeadPos = targetHeadPos; interpLeftHandPos = targetLeftHandPos; interpRightHandPos = targetRightHandPos; interpHeadRot = targetHeadRot; interpLeftHandRot = targetLeftHandRot; interpRightHandRot = targetRightHandRot; transform.position = interpHeadPos; } } catch (Exception e) { Misc.Logger.Exception($"Avatar controller exception: {_playerInfo.playerName}: {e}"); } }