using System; using System.Collections.Generic; using MoleMole.Config; using UniRx; using UnityEngine; using proto; namespace MoleMole { public class AvatarManager { private uint _localAvatarRuntimeID; private uint _helperAvatarRuntimeID; private Dictionary _avatarDict; private List _avatarLs; private List> _preloadedAvatar; private List _playerAvatars; public Action onLocalAvatarChanged; public bool isAutoBattle { get; private set; } private AvatarManager() { _avatarDict = new Dictionary(); _avatarLs = new List(); _preloadedAvatar = new List>(); _playerAvatars = new List(); _localAvatarRuntimeID = 0u; } public void InitAtAwake() { } public void InitAtStart() { } public void Core() { RemoveAllRemoveableAvatars(); } public List GetAllAvatars() { return _avatarLs; } public int GetActiveAvatarCount() { int num = 0; for (int i = 0; i < _avatarLs.Count; i++) { if (_avatarLs[i].IsActive()) { num++; } } return num; } public List GetAllPlayerAvatars() { return _playerAvatars; } public bool IsPlayerAvatar(BaseMonoAvatar avatar) { return _playerAvatars.Contains(avatar); } public bool IsPlayerAvatar(uint avatarID) { for (int i = 0; i < _playerAvatars.Count; i++) { if (_playerAvatars[i].GetRuntimeID() == avatarID) { return true; } } return false; } public BaseMonoAvatar GetAvatarByRuntimeID(uint runtimeID) { return _avatarDict[runtimeID]; } public BaseMonoAvatar TryGetAvatarByRuntimeID(uint runtimeID) { BaseMonoAvatar value; _avatarDict.TryGetValue(runtimeID, out value); return value; } public BaseMonoAvatar GetLocalAvatar() { return _avatarDict[_localAvatarRuntimeID]; } public BaseMonoAvatar TryGetLocalAvatar() { return (!_avatarDict.ContainsKey(_localAvatarRuntimeID)) ? null : _avatarDict[_localAvatarRuntimeID]; } public BaseMonoAvatar GetHelperAvatar() { return (_helperAvatarRuntimeID == 0 || !_avatarDict.ContainsKey(_helperAvatarRuntimeID)) ? null : _avatarDict[_helperAvatarRuntimeID]; } public BaseMonoAvatar GetTeamLeader() { return GetAllAvatars().Find((BaseMonoAvatar avatar) => avatar.isLeader); } public bool RemoveAvatarByRuntimeID(uint runtimeID) { BaseMonoAvatar baseMonoAvatar = _avatarDict[runtimeID]; Singleton.Instance.TryRemoveActor(runtimeID); UnityEngine.Object.Destroy(baseMonoAvatar.gameObject); bool flag = true; flag &= _playerAvatars.Remove(baseMonoAvatar); flag &= _avatarDict.Remove(runtimeID); return flag & _avatarLs.Remove(baseMonoAvatar); } public void PreloadAvatar(string avatarType, bool useLow) { GameObject original = Miscs.LoadResource(AvatarData.GetPrefabResPath(avatarType, useLow)); GameObject gameObject = (GameObject)UnityEngine.Object.Instantiate(original, InLevelData.CREATE_INIT_POS, Quaternion.Euler(0f, 200f, 0f)); gameObject.GetComponent().Preload(); _preloadedAvatar.Add(new Tuple(avatarType, gameObject)); } public void PreloadTeamAvatars() { List list = new List(); LevelScoreManager instance = Singleton.Instance; if (instance != null && instance.memberList != null) { list.AddRange(instance.memberList); } bool useLow = !GlobalVars.AVATAR_USE_DYNAMIC_BONE || Singleton.Instance.levelActor.levelMode == LevelActor.Mode.Multi; for (int i = 0; i < list.Count; i++) { PreloadAvatar(list[i].AvatarRegistryKey, useLow); } if (instance != null && instance.friendDetailItem != null) { FriendDetailDataItem friendDetailItem = instance.friendDetailItem; AvatarDataItem leaderAvatar = friendDetailItem.leaderAvatar; list.Add(leaderAvatar); PreloadAvatar(leaderAvatar.AvatarRegistryKey, true); } } public uint CreateAvatar(AvatarDataItem avatarDataItem, bool isLocal, Vector3 initPos, Vector3 initDir, uint runtimeID, bool isLeader, bool leaderSkillOn, bool isHelper = false, bool useLow = false) { //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Invalid comparison between Unknown and I4 BaseMonoAvatar baseMonoAvatar = null; string avatarRegistryKey = avatarDataItem.AvatarRegistryKey; GameObject gameObject = null; int index = -1; for (int i = 0; i < _preloadedAvatar.Count; i++) { if (_preloadedAvatar[i].Item1 == avatarRegistryKey) { gameObject = _preloadedAvatar[i].Item2; index = i; break; } } if (gameObject != null) { gameObject.GetComponent().Enable(); _preloadedAvatar.RemoveAt(index); } else { useLow = useLow || !GlobalVars.AVATAR_USE_DYNAMIC_BONE || Singleton.Instance.levelActor.levelMode == LevelActor.Mode.Multi; GameObject original = Miscs.LoadResource(AvatarData.GetPrefabResPath(avatarRegistryKey, useLow)); gameObject = (GameObject)UnityEngine.Object.Instantiate(original, InLevelData.CREATE_INIT_POS, Quaternion.Euler(0f, 200f, 0f)); } baseMonoAvatar = gameObject.GetComponent(); if (runtimeID == 0) { runtimeID = Singleton.Instance.GetNextRuntimeID(3); } baseMonoAvatar.Init(isLocal, runtimeID, avatarDataItem.AvatarRegistryKey, avatarDataItem.GetWeapon().ID, initPos, initDir, isLeader); bool isPlayerAvatar = !isHelper; RegisterAvatar(baseMonoAvatar, isLocal, isPlayerAvatar, isHelper); AvatarActor avatarActor = Singleton.Instance.CreateActor(baseMonoAvatar); avatarActor.InitAvatarDataItem(avatarDataItem, isLocal, isHelper, isLeader, leaderSkillOn); avatarActor.InitGalTouchBuff(avatarDataItem); avatarActor.PostInit(); LevelScoreManager instance = Singleton.Instance; if ((int)instance.LevelType == 4) { EndlessAvatarHp endlessAvatarHPData = Singleton.Instance.GetEndlessAvatarHPData(avatarDataItem.avatarID); avatarActor.HP = (float)avatarActor.maxHP * (float)endlessAvatarHPData.hp_percent / 100f; avatarActor.SP = (float)avatarActor.maxSP * (float)endlessAvatarHPData.sp_percent / 100f; } ConfigAvatar config = baseMonoAvatar.config; for (int j = 0; j < config.CommonArguments.PreloadEffectPatternGroups.Length; j++) { Singleton.Instance.PreloadEffectGroup(config.CommonArguments.PreloadEffectPatternGroups[j]); } if (baseMonoAvatar is MonoBronya) { if (avatarActor.HasAppliedAbilityName("Weapon_Additional_BronyaLaser")) { Singleton.Instance.PreloadEffectGroup("Bronya_Laser_Effects"); } else { Singleton.Instance.PreloadEffectGroup("Bronya_Gun_Effects"); } } for (int k = 0; k < config.CommonArguments.RequestSoundBankNames.Length; k++) { Singleton.Instance.ManualPrepareBank(config.CommonArguments.RequestSoundBankNames[k]); } return baseMonoAvatar.GetRuntimeID(); } public uint CreateAvatarMirror(BaseMonoAvatar owner, Vector3 initPos, Vector3 initDir, string AIName, float hpRatio) { GameObject gameObject = (GameObject)UnityEngine.Object.Instantiate(Miscs.LoadResource(AvatarData.GetPrefabResPath(owner.AvatarTypeName, true)), initPos, Quaternion.LookRotation(initDir)); BaseMonoAvatar component = gameObject.GetComponent(); component.Init(false, Singleton.Instance.GetNextRuntimeID(3), owner.AvatarTypeName, owner.EquipedWeaponID, initPos, initDir, false); RegisterAvatar(component, false, false, false); AvatarMirrorActor avatarMirrorActor = Singleton.Instance.CreateActor(component); avatarMirrorActor.InitFromAvatarActor(Singleton.Instance.GetActor(owner.GetRuntimeID()), hpRatio); avatarMirrorActor.PostInit(); component.TriggerSwitchIn(); BTreeAvatarAIController bTreeAvatarAIController = component.GetActiveAIController() as BTreeAvatarAIController; if (string.IsNullOrEmpty(AIName)) { bTreeAvatarAIController.SetActive(false); } else { bTreeAvatarAIController.ChangeBehavior(AIName); component.ForceUseAIController(); } return component.GetRuntimeID(); } public void RegisterAvatar(BaseMonoAvatar avatar, bool isLocal, bool isPlayerAvatar, bool isHelperAvatar) { _avatarLs.Add(avatar); _avatarDict.Add(avatar.GetRuntimeID(), avatar); if (isLocal) { _localAvatarRuntimeID = avatar.GetRuntimeID(); } if (isHelperAvatar) { _helperAvatarRuntimeID = avatar.GetRuntimeID(); } if (isPlayerAvatar) { _playerAvatars.Add(avatar); avatar.onDie = (Action)Delegate.Combine(avatar.onDie, new Action(OnPlayerAvatarDie)); } } private void RemoveAllRemoveableAvatars() { for (int i = 0; i < _avatarLs.Count; i++) { BaseMonoAvatar baseMonoAvatar = _avatarLs[i]; if (baseMonoAvatar.IsToBeRemove()) { RemoveAvatarByRuntimeID(baseMonoAvatar.GetRuntimeID()); i--; } } } public void RemoveAllAvatars() { int num; for (num = 0; num < _avatarLs.Count; num++) { BaseMonoAvatar baseMonoAvatar = _avatarLs[num]; if (!baseMonoAvatar.IsToBeRemove()) { baseMonoAvatar.SetDied(KillEffect.KillImmediately); } RemoveAvatarByRuntimeID(baseMonoAvatar.GetRuntimeID()); num--; } } public void SetPause(bool pause) { foreach (BaseMonoAvatar value in _avatarDict.Values) { value.SetPause(pause); } } public void SetAutoBattle(bool isAuto) { isAutoBattle = isAuto; GetLocalAvatar().RefreshController(); } public void SetLocalAvatar(uint runtimeID) { uint localAvatarRuntimeID = _localAvatarRuntimeID; _localAvatarRuntimeID = runtimeID; if (onLocalAvatarChanged != null) { onLocalAvatarChanged(_avatarDict[localAvatarRuntimeID], _avatarDict[_localAvatarRuntimeID]); } Singleton.Instance.FireEvent(new EvtLocalAvatarChanged(runtimeID, localAvatarRuntimeID)); } public bool IsLocalAvatar(uint runtimeID) { return runtimeID == _localAvatarRuntimeID; } public bool IsHelperAvatar(uint runtimeID) { return runtimeID == _helperAvatarRuntimeID; } public void CreateTeamAvatars() { List memberList = Singleton.Instance.memberList; for (int i = 0; i < memberList.Count; i++) { bool isLocal = i == 0; bool flag = i == 0; Singleton.Instance.CreateAvatar(memberList[i], isLocal, InLevelData.CREATE_INIT_POS, InLevelData.CREATE_INIT_FORWARD, Singleton.Instance.GetNextRuntimeID(3), flag, flag); } CreateAvatarHelper(); _preloadedAvatar.Clear(); } private void CreateAvatarHelper() { if (Singleton.Instance.friendDetailItem != null && _helperAvatarRuntimeID == 0) { FriendDetailDataItem friendDetailItem = Singleton.Instance.friendDetailItem; AvatarDataItem leaderAvatar = friendDetailItem.leaderAvatar; bool leaderSkillOn = Singleton.Instance.IsMyFriend(friendDetailItem.uid); Singleton.Instance.CreateAvatar(leaderAvatar, false, InLevelData.CREATE_INIT_POS, InLevelData.CREATE_INIT_FORWARD, Singleton.Instance.GetNextRuntimeID(3), false, leaderSkillOn, true, true); } } public void ShowHelperAvater() { BaseMonoAvatar helperAvatar = GetHelperAvatar(); if (!(helperAvatar != null)) { return; } AvatarActor actor = Singleton.Instance.GetActor(helperAvatar.GetRuntimeID()); List allPlayerAvatars = Singleton.Instance.GetAllPlayerAvatars(); int num = 0; foreach (BaseMonoAvatar item in allPlayerAvatars) { AvatarActor actor2 = Singleton.Instance.GetActor(item.GetRuntimeID()); if (actor2 != null) { num = Math.Max(actor2.level, num); } } float num2 = ((num <= (int)actor.level) ? (AvatarLevelMetaDataReader.GetAvatarLevelMetaDataByKey(num).avatarAssistConf / AvatarLevelMetaDataReader.GetAvatarLevelMetaDataByKey(actor.level).avatarAssistConf) : 1f); actor.attack = (float)actor.attack * num2; actor.GetPlugin().TriggerSwitchIn(); } public void HideHelperAvatar(bool force) { BaseMonoAvatar helperAvatar = GetHelperAvatar(); if (helperAvatar != null) { AvatarActor actor = Singleton.Instance.GetActor(helperAvatar.GetRuntimeID()); actor.GetPlugin().TriggerSwitchOut(force); } } public void InitAvatarsPos(List avatarSpawnPointList) { Vector3[] array = new Vector3[3] { Vector3.zero, Vector3.zero, Vector3.zero }; switch (Singleton.Instance.levelActor.levelMode) { case LevelActor.Mode.Single: array = InLevelData.SINGLE_MODE_AVATAR_INIT_POS_LIST; break; case LevelActor.Mode.Multi: case LevelActor.Mode.NetworkedMP: array = InLevelData.MUTIL_MODE_AVATAR_INIT_POS_LIST; break; case LevelActor.Mode.MultiRemote: array = InLevelData.MUTIL_REMOTE_MODE_AVATAR_INIT_POS_LIST; break; } List allPlayerAvatars = Singleton.Instance.GetAllPlayerAvatars(); if (Singleton.Instance.levelActor.levelMode != LevelActor.Mode.NetworkedMP) { allPlayerAvatars.Sort(Compare); } for (int i = 0; i < allPlayerAvatars.Count; i++) { if (allPlayerAvatars[i].IsActive()) { if (Singleton.Instance.levelActor.levelMode == LevelActor.Mode.MultiRemote) { allPlayerAvatars[i].transform.position = avatarSpawnPointList[i].transform.TransformPoint(array[i]); allPlayerAvatars[i].transform.forward = avatarSpawnPointList[i].transform.forward; } else { allPlayerAvatars[i].transform.position = avatarSpawnPointList[0].transform.TransformPoint(array[i]); allPlayerAvatars[i].transform.forward = avatarSpawnPointList[0].transform.forward; } } else { allPlayerAvatars[i].transform.position = InLevelData.CREATE_INIT_POS; } } } private int Compare(BaseMonoAvatar a, BaseMonoAvatar b) { if (a.GetRuntimeID() == _localAvatarRuntimeID && b.GetRuntimeID() != _localAvatarRuntimeID) { return -1; } if (a.GetRuntimeID() != _localAvatarRuntimeID && b.GetRuntimeID() == _localAvatarRuntimeID) { return 1; } if (a.IsActive() && !b.IsActive()) { return -1; } if (!a.IsActive() && b.IsActive()) { return 1; } return 0; } public void SetMuteAllAvatarControl(bool mute) { foreach (BaseMonoAvatar value in _avatarDict.Values) { value.SetCountedMuteControl(mute); if (value.IsActive()) { value.OrderMove = false; value.ClearAttackTriggers(); } } } public void Destroy() { for (int i = 0; i < _preloadedAvatar.Count; i++) { if (_preloadedAvatar[i] != null && _preloadedAvatar[i].Item2 != null) { UnityEngine.Object.DestroyImmediate(_preloadedAvatar[i].Item2); } } for (int j = 0; j < _avatarLs.Count; j++) { if (_avatarLs[j] != null) { UnityEngine.Object.DestroyImmediate(_avatarLs[j]); } } onLocalAvatarChanged = null; } public void SetAllAvatarVisibility(bool visible) { for (int i = 0; i < _avatarLs.Count; i++) { BaseMonoAvatar baseMonoAvatar = _avatarLs[i]; for (int j = 0; j < baseMonoAvatar.renderers.Length; j++) { baseMonoAvatar.renderers[j].enabled = visible; } } } public void SetAvatarVisibility(bool visible, BaseMonoAvatar avatar) { if (_avatarLs.Contains(avatar)) { for (int i = 0; i < avatar.renderers.Length; i++) { avatar.renderers[i].enabled = visible; } } } public BaseMonoAvatar GetFirstAliveAvatar() { List playerAvatars = _playerAvatars; for (int i = 0; i < playerAvatars.Count; i++) { if (playerAvatars[i].IsAlive()) { return playerAvatars[i]; } } return null; } private void OnPlayerAvatarDie(BaseMonoAvatar avatar) { if (!IsLocalAvatar(avatar.GetRuntimeID())) { avatar.gameObject.SetActive(false); } else { Singleton.Instance.gameMode.HandleLocalPlayerAvatarDie(avatar); } } } }