using System; using System.Collections; using System.Collections.Generic; using MoleMole.Config; using UnityEngine; using proto; using Material = UnityEngine.Material; namespace MoleMole { public abstract class BaseMonoUIAvatar : MonoBehaviour, IWeaponAttacher, IBodyPartTouchable { private class ColorAdjuster { private Material _material; private Color[] colors; private string[] colorNames; public ColorAdjuster(Material material, string[] colorNames) { _material = material; this.colorNames = colorNames; colors = new Color[this.colorNames.Length]; for (int i = 0; i < this.colorNames.Length; i++) { colors[i] = _material.GetColor(colorNames[i]); } } public void ApplyLerp(float factor) { for (int i = 0; i < colors.Length; i++) { _material.SetColor(colorNames[i], Color.Lerp(colors[i], Color.white, factor)); } } public void ApplyMultiply(Color tintColor) { for (int i = 0; i < colors.Length; i++) { _material.SetColor(colorNames[i], colors[i] * tintColor); } } public void Restore() { for (int i = 0; i < colors.Length; i++) { _material.SetColor(colorNames[i], colors[i]); } } } private const string ORDINARY_FEEL_PATH = "UI/Menus/Widget/Storage/OrdinaryFeeling"; private const string GOOD_FEEL_PATH = "UI/Menus/Widget/Storage/GoodFeeling"; private const string BUFF_EFFECT_FOLDER = "Effect/GalTouchBuff/"; private const float IDLE_EFFECT_INTERVAL = 15f; private const string SILENT_EFFECT_NAME = "EmotionSilent"; private int _weaponMetaID; public int avatarID; public string galTouchControllerPath; public float effectYOffset; private Vector3 _originPos; public Renderer[] renderers; private GameObject _ordinaryFeelPrototype; private GameObject _goodFeelPrototype; private List _shadowColorAdjusterList; private List _mainColorAdjusterList; private bool _isShadowColorAdjusted; private bool _isAppliedLightColor; public bool tattooVisible; public AvatarDataItem avatarData; [HideInInspector] public AttachPoint[] attachPoints = new AttachPoint[0]; public Renderer leftEyeRenderer; public Renderer rightEyeRenderer; public Renderer mouthRenderer; public Transform headRoot; public GameObject[] switchObjects; public GameObject[] galTouchHideObjects; private GalTouchSystem galTouchSystem; private RuntimeAnimatorController _originAnimatorController; private RuntimeAnimatorController _galtouchAnimController; private bool _readyToRestart; private float _fadeSpeed; private bool _fading; private Animator _animator; private float _camShakeTimer = -1f; private Vector3 _cameraOrigionPostion; private bool _galTouchInited; private float _idleEffectTimer; private AtlasMatInfoProvider _providerL; private AtlasMatInfoProvider _providerR; private AtlasMatInfoProvider _providerM; private GameObject _buffEffect; private bool _isInGalTouch; public int WeaponMetaID { get { return _weaponMetaID; } } public bool standOnSpaceshipInGameEntry { get; set; } GameObject IWeaponAttacher.gameObject { get { return base.gameObject; } } private void OnEnable() { if (Application.isEditor) { InitMaterials(); } } private void OnDisable() { if (Application.isEditor) { RestoreLightColor(); RestoreShadowColor(); _mainColorAdjusterList = null; _shadowColorAdjusterList = null; } } public virtual void Init(int avatarID) { this.avatarID = avatarID; InitMaterials(); InitDynamicBone(); UploadFaceTexture(); } protected virtual void Update() { if (!_isShadowColorAdjusted || Application.isEditor) { AdjustShadowColors(); } if (!_isAppliedLightColor || Application.isEditor) { ApplyLightColor(); } UpdateStandOnSpaceshipInGameEntry(); UpdateGalTouchSystem(); } private void InitMaterials() { InitColorAdjusterList(); AdjustShadowColors(); ApplyLightColor(); } private void InitColorAdjusterList() { bool flag = false; bool flag2 = false; if (_shadowColorAdjusterList == null) { flag = true; _shadowColorAdjusterList = new List(); } if (_mainColorAdjusterList == null) { flag2 = true; _mainColorAdjusterList = new List(); } if (!flag && !flag2) { return; } string[] colorNames = new string[2] { "_FirstShadowMultColor", "_SecondShadowMultColor" }; string[] colorNames2 = new string[1] { "_Color" }; Renderer[] array = renderers; foreach (Renderer renderer in array) { Material[] materials = renderer.materials; foreach (Material material in materials) { if (flag && material.HasProperty("_FirstShadowMultColor")) { _shadowColorAdjusterList.Add(new ColorAdjuster(material, colorNames)); } if (flag2 && material.HasProperty("_Color")) { _mainColorAdjusterList.Add(new ColorAdjuster(material, colorNames2)); } } } } private void AdjustShadowColors() { Camera main = Camera.main; if (main == null) { return; } PostFXBase component = main.GetComponent(); if (!(component != null)) { return; } float avatarShadowAdjust = component.AvatarShadowAdjust; foreach (ColorAdjuster shadowColorAdjuster in _shadowColorAdjusterList) { shadowColorAdjuster.ApplyLerp(avatarShadowAdjust); } _isShadowColorAdjusted = true; } private void RestoreShadowColor() { foreach (ColorAdjuster shadowColorAdjuster in _shadowColorAdjusterList) { shadowColorAdjuster.Restore(); } } private void ApplyLightColor() { Light light = UnityEngine.Object.FindObjectOfType(); if (!(light != null)) { return; } Color tintColor = light.color * light.intensity; foreach (ColorAdjuster mainColorAdjuster in _mainColorAdjusterList) { mainColorAdjuster.ApplyMultiply(tintColor); } _isAppliedLightColor = true; } private void UploadFaceTexture() { if (leftEyeRenderer != null) { leftEyeRenderer.sharedMaterial.mainTexture = leftEyeRenderer.sharedMaterial.mainTexture; } if (rightEyeRenderer != null) { rightEyeRenderer.sharedMaterial.mainTexture = rightEyeRenderer.sharedMaterial.mainTexture; } if (mouthRenderer != null) { mouthRenderer.sharedMaterial.mainTexture = mouthRenderer.sharedMaterial.mainTexture; } } private void RestoreLightColor() { foreach (ColorAdjuster mainColorAdjuster in _mainColorAdjusterList) { mainColorAdjuster.Restore(); } } public bool HasAttachPoint(string name) { for (int i = 0; i < attachPoints.Length; i++) { if (attachPoints[i].name == name) { return true; } } return false; } public Transform GetAttachPoint(string name) { for (int i = 0; i < attachPoints.Length; i++) { if (attachPoints[i].name == name) { return attachPoints[i].pointTransform; } } return base.transform; } public void AttachWeapon(int weaponID, string avatarType) { if (_weaponMetaID != weaponID) { _weaponMetaID = weaponID; ConfigWeapon weaponConfig = WeaponData.GetWeaponConfig(weaponID); Transform weaponProtoTrans = Miscs.LoadResource(weaponConfig.Attach.PrefabPath).transform; WeaponAttach.AttachWeaponMesh(weaponConfig, this, weaponProtoTrans, avatarType); int layer = 8; base.gameObject.SetLayer(layer, true); } } public void SetTattooVisible(int visible) { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) GameObject gameObject = GetAttachPoint("Stigmata").gameObject; if (visible == 0) { gameObject.SetActive(false); } else { if (!tattooVisible) { return; } GetAttachPoint("Stigmata").gameObject.SetActive(true); foreach (KeyValuePair item in avatarData.GetStigmataDict()) { Transform attachPoint = GetAttachPoint(((Enum)item.Key).ToString()); if (!(attachPoint == null)) { attachPoint.gameObject.SetActive(item.Value != null); if (item.Value != null) { StigmataFadeIn(item.Key); } } } } } public void ChangeStigmata(StigmataDataItem from, StigmataDataItem to, EquipmentSlot slot) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) StartCoroutine(CorrutineChangeStigmata(from, to, slot)); } private IEnumerator CorrutineChangeStigmata(StigmataDataItem from, StigmataDataItem to, EquipmentSlot slot) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) float speed = 1f; Transform stigmataTrans = GetAttachPoint(((Enum)slot).ToString()); stigmataTrans.gameObject.SetActive(true); Material material = stigmataTrans.GetComponent().material; float emissionFactorOrigin = material.GetFloat("_EmissionFactor"); float emissionFactor = emissionFactorOrigin; if (from != null) { while (emissionFactor < 14f) { emissionFactor += speed; material.SetFloat("_EmissionFactor", emissionFactor); yield return null; } } if (to == null) { stigmataTrans.gameObject.SetActive(false); yield break; } material.SetTexture("_MainTex", Miscs.LoadResource(to.GetTattooPath())); while (emissionFactor < 20f) { emissionFactor += speed; material.SetFloat("_EmissionFactor", emissionFactor); yield return null; } while (emissionFactor > 1.5f) { emissionFactor -= speed; material.SetFloat("_EmissionFactor", emissionFactor); yield return null; } material.SetFloat("_EmissionFactor", emissionFactor); } public void StigmataFadeIn(EquipmentSlot slot) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) StartCoroutine(CorrutineStigmataFadeIn(slot)); } private IEnumerator CorrutineStigmataFadeIn(EquipmentSlot slot) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) float speed = 1f; Transform stigmataTrans = GetAttachPoint(((Enum)slot).ToString()); stigmataTrans.gameObject.SetActive(true); Material material = stigmataTrans.GetComponent().material; float emissionFactorOrigin = material.GetFloat("_EmissionFactor"); float emissionFactor = emissionFactorOrigin; while (emissionFactor < 20f) { emissionFactor += speed; material.SetFloat("_EmissionFactor", emissionFactor); yield return null; } while (emissionFactor > 1.5f) { emissionFactor -= speed; material.SetFloat("_EmissionFactor", emissionFactor); yield return null; } material.SetFloat("_EmissionFactor", emissionFactor); } public void StigmataFadeOut(EquipmentSlot slot) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) StartCoroutine(CorrutineStigmataFadeOut(slot)); } private IEnumerator CorrutineStigmataFadeOut(EquipmentSlot slot) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) float speed = 1f; Transform stigmataTrans = GetAttachPoint(((Enum)slot).ToString()); stigmataTrans.gameObject.SetActive(true); Material material = stigmataTrans.GetComponent().material; float emissionFactor = material.GetFloat("_EmissionFactor"); float emissionFactorOriginal = emissionFactor; float bloomFactor = material.GetFloat("_BloomFactor"); float bloomFactorOriginal = bloomFactor; float speedRatio = 0.3f; while (emissionFactor < 10f) { speedRatio += 0.001f; if (speedRatio > 5f) { speedRatio = 5f; } emissionFactor += speed * speedRatio; material.SetFloat("_EmissionFactor", emissionFactor); yield return null; } material.SetFloat("_EmissionFactor", emissionFactorOriginal); material.SetFloat("_BloomFactor", bloomFactorOriginal); stigmataTrans.gameObject.SetActive(false); } private void InitDynamicBone() { bool uI_AVATAR_USE_DYNAMIC_BONE = GlobalVars.UI_AVATAR_USE_DYNAMIC_BONE; DynamicBone[] componentsInChildren = base.gameObject.GetComponentsInChildren(); DynamicBone[] array = componentsInChildren; foreach (DynamicBone dynamicBone in array) { dynamicBone.enabled = uI_AVATAR_USE_DYNAMIC_BONE; } } public void SetOriginPos(Vector3 originPos) { _originPos = originPos; } private void UpdateStandOnSpaceshipInGameEntry() { if (standOnSpaceshipInGameEntry && Singleton.Instance != null && Singleton.Instance.SceneCanvas != null && Singleton.Instance.SceneCanvas is MonoGameEntry) { float y = _originPos.y; MonoGameEntry monoGameEntry = Singleton.Instance.SceneCanvas as MonoGameEntry; Transform transform = monoGameEntry.spaceshipGO.transform.Find("Warship"); base.transform.position = new Vector3(_originPos.x, y + transform.position.y - monoGameEntry.warshipDefaultYPos, _originPos.z); } } private void InitGalTouch() { if (!(leftEyeRenderer == null) && !(rightEyeRenderer == null) && !(mouthRenderer == null) && !(_originAnimatorController != null)) { _animator = GetComponent(); galTouchSystem = new GalTouchSystem(); string text = null; if (avatarID / 100 == 1) { text = "Kiana"; } else if (avatarID / 100 == 2) { text = "Mei"; } else if (avatarID / 100 == 3) { text = "Bronya"; } string path = "FaceAtlas/" + text + "/Eye/Atlas"; string path2 = "FaceAtlas/" + text + "/Mouth/Atlas"; if (_providerL == null) { _providerL = Resources.Load(path); _providerL.RetainReference(); } if (_providerR == null) { _providerR = Resources.Load(path); _providerR.RetainReference(); } if (_providerM == null) { _providerM = Resources.Load(path2); _providerM.RetainReference(); } galTouchSystem.Init(GetComponent(), avatarData.avatarID, 1, leftEyeRenderer, rightEyeRenderer, mouthRenderer, _providerL, _providerR, _providerM, headRoot); _originAnimatorController = GetComponent().runtimeAnimatorController; MonoBodyPart[] componentsInChildren = base.gameObject.GetComponentsInChildren(); int i = 0; for (int num = componentsInChildren.Length; i < num; i++) { componentsInChildren[i].SetBodyPartTouchable(this); } int j = 0; for (int num2 = switchObjects.Length; j < num2; j++) { switchObjects[j].SetActive(false); } galTouchSystem.IdleChanged += OnGalTouchSystemIdleChanged; galTouchSystem.TouchPatternTriggered += OnTouchPatternTriggered; _ordinaryFeelPrototype = Resources.Load("UI/Menus/Widget/Storage/OrdinaryFeeling"); _goodFeelPrototype = Resources.Load("UI/Menus/Widget/Storage/GoodFeeling"); _galTouchInited = true; } } public void BodyPartTouched(BodyPartType type, Vector3 point) { if (Singleton.Instance.DispatchSeverData.isReview) { return; } BasePageContext currentPageContext = Singleton.Instance.CurrentPageContext; if (currentPageContext != null && currentPageContext.dialogContextList.Count > 0) { return; } int heartLevel = galTouchSystem.heartLevel; if (!galTouchSystem.BodyPartTouched(type)) { return; } GameObject gameObject = null; gameObject = ((heartLevel < 4) ? _ordinaryFeelPrototype : _goodFeelPrototype); if (gameObject != null) { GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject); if (gameObject2 != null) { gameObject2.transform.position = point; } } _idleEffectTimer = 15f; GameObject gameObject3 = GameObject.Find("EmotionSilent"); if (gameObject3 != null) { UnityEngine.Object.Destroy(gameObject3); } } private void GalTouchRollBuff(int partIndex) { TouchLevelItem touchLevelItem = GalTouchData.GetTouchLevelItem(galTouchSystem.heartLevel); if (touchLevelItem == null) { return; } float prop = touchLevelItem.prop; float value = UnityEngine.Random.value; if (value < prop) { int[] array = GalTouchData.QueryTouchBuff(avatarID, partIndex, galTouchSystem.heartLevel); if (array != null) { value = UnityEngine.Random.value; int num = (int)(value * (float)array.Length); Singleton.Instance.AddBuff(avatarID, array[num]); } } } public void UpdateGalTouchSystem() { if (galTouchSystem != null) { galTouchSystem.Process(Time.deltaTime); if (galTouchSystem.enable) { _idleEffectTimer -= Time.deltaTime; if (_idleEffectTimer <= 0f) { _idleEffectTimer += 15f; GalTouchEffect("EmotionSilent"); } } if (!galTouchSystem.idle) { _idleEffectTimer = 15f; } } if (_readyToRestart && galTouchSystem.idle) { GeneralLogicManager.RestartGame(); } if (_fading) { PostFX component = Camera.main.gameObject.GetComponent(); component.Exposure -= _fadeSpeed * Time.deltaTime; component.Exposure = ((!(component.Exposure >= 0f)) ? 0f : component.Exposure); } if (_camShakeTimer > 0f) { _camShakeTimer -= Time.deltaTime; if (_camShakeTimer > 0f) { Vector3 vector = new Vector3(0f, Mathf.Sin(_camShakeTimer * 900f) * 0.2f, 0f); Camera.main.transform.localPosition = _cameraOrigionPostion + vector; } else { _camShakeTimer = -1f; Camera.main.transform.localPosition = _cameraOrigionPostion; } } BasePageContext basePageContext = ((!(Singleton.Instance.SceneCanvas is MonoMainCanvas)) ? null : Singleton.Instance.CurrentPageContext); if (basePageContext != null && basePageContext.dialogContextList.Count > 0) { _idleEffectTimer = 15f; } } public void EnterGalTouch() { if (!_galTouchInited) { InitGalTouch(); } if (_isInGalTouch) { return; } if (galTouchSystem != null) { galTouchSystem.enable = true; if (_animator != null) { _galtouchAnimController = GetRuntimeAnimatorControllerByID(); _animator.runtimeAnimatorController = _galtouchAnimController; } int characterHeartLevel = Singleton.Instance.GetCharacterHeartLevel(); if (Singleton.Instance != null) { Singleton.Instance.GalTouchInfoChanged += OnGalTouchInfoChanged; Singleton.Instance.GalAddBuff += OnGalTouchAddBuff; } galTouchSystem.heartLevel = ((characterHeartLevel <= 4) ? characterHeartLevel : 4); } int i = 0; for (int num = galTouchHideObjects.Length; i < num; i++) { galTouchHideObjects[i].SetActive(false); } int avatarGalTouchBuffId = Singleton.Instance.GetAvatarGalTouchBuffId(avatarID); ProcessBuffEffectOfBuffId(avatarGalTouchBuffId); _idleEffectTimer = 15f; _isInGalTouch = true; } private RuntimeAnimatorController GetRuntimeAnimatorControllerByID() { string text = "Entities/Avatar/"; string text2 = galTouchControllerPath; return Resources.Load(text + text2); } public void ExitGalTouch() { if (_readyToRestart) { GeneralLogicManager.RestartGame(); } if (!_isInGalTouch) { return; } if (galTouchSystem != null) { galTouchSystem.enable = false; galTouchSystem.StopFaceAnimation(); galTouchSystem.StopVoice(); if (_animator != null) { _animator.runtimeAnimatorController = _originAnimatorController; Resources.UnloadAsset(_galtouchAnimController); _galtouchAnimController = null; } if (Singleton.Instance != null) { Singleton.Instance.GalTouchInfoChanged -= OnGalTouchInfoChanged; Singleton.Instance.GalAddBuff -= OnGalTouchAddBuff; } } int i = 0; for (int num = galTouchHideObjects.Length; i < num; i++) { if (galTouchHideObjects[i] != null) { galTouchHideObjects[i].SetActive(true); } } DetachBuffEffect(); _isInGalTouch = false; } protected void OnDestroy() { if (_isInGalTouch && Singleton.Instance != null) { Singleton.Instance.GalTouchInfoChanged -= OnGalTouchInfoChanged; Singleton.Instance.GalAddBuff -= OnGalTouchAddBuff; } if (_providerL != null) { if (_providerL.ReleaseReference()) { Resources.UnloadAsset(_providerL); } _providerL = null; } if (_providerR != null) { if (_providerR.ReleaseReference()) { Resources.UnloadAsset(_providerR); } _providerR = null; } if (_providerM != null) { if (_providerM.ReleaseReference()) { Resources.UnloadAsset(_providerM); } _providerM = null; } } private void OnGalTouchSystemIdleChanged(bool idle) { if (idle) { int i = 0; for (int num = switchObjects.Length; i < num; i++) { switchObjects[i].SetActive(false); } int j = 0; for (int num2 = galTouchHideObjects.Length; j < num2; j++) { galTouchHideObjects[j].SetActive(false); } } } private void OnTouchPatternTriggered(int partIndex) { int amount = GalTouchData.QueryTouchFeel(avatarID, partIndex, Singleton.Instance.GetCharacterHeartLevel()); GalTouchRollBuff(partIndex); Singleton.Instance.IncreaseTouchGoodFeel(amount); } public void OnGalTouchInfoChanged(int oldGoodFeel, int oldHeartLevel, int newGoodFeel, int newHeartLevel, GoodFeelLimitType limitType) { if (oldHeartLevel != newHeartLevel) { galTouchSystem.heartLevel = ((newHeartLevel <= 4) ? newHeartLevel : 4); } } public void OnGalTouchAddBuff(int avatarId, int buffId) { if (avatarId == avatarID) { ProcessBuffEffectOfBuffId(buffId); } } private void ProcessBuffEffectOfBuffId(int buffId) { if (buffId != 0) { TouchBuffItem touchBuffItem = GalTouchData.GetTouchBuffItem(buffId); if (touchBuffItem != null) { AttachBuffEffect(touchBuffItem.effect); } } else { DetachBuffEffect(); } } private void AttachBuffEffect(string name) { string path = "Effect/GalTouchBuff/" + name; GameObject gameObject = Resources.Load(path); if (gameObject != null) { if (_buffEffect != null) { UnityEngine.Object.Destroy(_buffEffect); } _buffEffect = UnityEngine.Object.Instantiate(gameObject); if (_buffEffect != null) { _buffEffect.transform.SetParent(base.transform, false); } } } private void DetachBuffEffect() { if (_buffEffect != null) { UnityEngine.Object.Destroy(_buffEffect); _buffEffect = null; } } public void SwitchOn(string name) { int i = 0; for (int num = switchObjects.Length; i < num; i++) { if (switchObjects[i].name == name) { switchObjects[i].SetActive(true); break; } } } public void SwitchOff(string name) { int i = 0; for (int num = switchObjects.Length; i < num; i++) { if (switchObjects[i].name == name) { switchObjects[i].SetActive(false); break; } } } public void ShowHiden(int show) { int i = 0; for (int num = galTouchHideObjects.Length; i < num; i++) { galTouchHideObjects[i].SetActive(show != 0); } } public void FadeBlack(float speed = 60f) { int i = 0; for (int allCamerasCount = Camera.allCamerasCount; i < allCamerasCount; i++) { Camera camera = Camera.allCameras[i]; if (camera != Camera.main) { camera.enabled = false; } _fading = true; _fadeSpeed = speed; } } public void RestartGame() { _readyToRestart = true; } public void CameraShake(float time) { _cameraOrigionPostion = Camera.main.transform.localPosition; _camShakeTimer = time; } public void TriggerAudioPattern(string name) { Singleton.Instance.Post(name, base.gameObject); } public void GalTouchEffect(string name) { string[] array = name.Split(','); string text = array[0]; string text2 = ((array.Length < 2) ? null : array[1]); string text3 = ((array.Length < 3) ? null : array[2]); string path = "UI/Menus/Widget/Storage/" + text; GameObject gameObject = Resources.Load(path); if (gameObject != null) { GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject); float result = 0f; if (text2 != null) { float.TryParse(text2, out result); } float result2 = 0f; if (text3 != null) { float.TryParse(text3, out result2); } gameObject2.transform.position = gameObject2.transform.position + new Vector3(result, result2 + effectYOffset, 0f); gameObject2.name = name; } } } }