using System; using System.Collections; using System.Collections.Generic; using MoleMole.Config; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using proto; namespace MoleMole { public class NewbieDialogContext : BaseDialogContext { public enum BubblePosType { None = 0, LeftUp = 1, LeftBottom = 2, RightUp = 3, RightBottom = 4 } public enum HandIconPosType { None = 0, Up = 1, Bottom = 2, Left = 3, Right = 4, Downward = 5, Tips = 6, Arrow = 7 } private const float HAND_ICON_ANIM_MOVE_DISTANCE = 30f; private const float HAND_ICON_ANIM_MOVE_DURATION = 0.15f; private const string expPrefabPath = "SpriteOutput/RewardGotIcons/Exp"; private const string scoinPrefabPath = "SpriteOutput/RewardGotIcons/SCoin"; private const string hcoinPrefabPath = "SpriteOutput/RewardGotIcons/HCoin"; private const string friendPointPrefabPath = "SpriteOutput/RewardGotIcons/FriendPoint"; private const string skillPointPrefabPath = "SpriteOutput/RewardGotIcons/SkillPoint"; private const string staminaPrefabPath = "SpriteOutput/RewardGotIcons/Stamina"; public bool disableMask; public Transform highlightTrans; public string highlightPath = string.Empty; public BubblePosType bubblePosType; public HandIconPosType handIconPosType; public bool disableHighlightEffect; public string guideDesc; public bool isMaskClickable; public bool disableHighlightInvoke; public Action preCallback; public Action pointerDownCallback; public Func pointerUpCallback; public Action destroyCallback; public Action destroyButNoClickedCallback; public Action destroyButHasClickedCallback; public float delayShowTime; public float delayInputTime; public Sprite guideSprite; public bool destroyByOthers; public bool bShowReward; public int rewardID; public int guideID; public bool bShowSkip; private Coroutine _delayShowCoroution; private bool _hasClicked; private NewbieHighlightInfo _newbieHightlightInfo; private Coroutine _handIconAnimCoroution; public bool playHighlightAnim; public BaseContext referredContext; private Coroutine _highlightEffectCoroution; private float _hightlightEffectAngleSpeed = 300f; private bool _isHighlightEffectStarted; private bool _waitDestroy; private Coroutine _delayInputCoroutine; private Coroutine _destroyCoroutine; private bool _hasSetup; private bool _hasDestroied; private SequenceAnimationManager _animationManager; private bool _bRewardClicked; public NewbieDialogContext() { config = new ContextPattern { contextName = "NewbieDialogContext", viewPrefabPath = "UI/Menus/Dialog/Newbie/NewbieDialog", cacheType = ViewCacheType.DontCache }; } public override bool OnPacket(NetPacketV1 pkt) { ushort cmdId = pkt.getCmdId(); if (cmdId == 186) { return OnGetGuideRewardRsp(pkt.getData()); } return false; } public override bool OnNotify(Notify ntf) { return false; } protected override bool SetupView() { if (_hasSetup) { return false; } _hasSetup = true; SetupReward(); if (_newbieHightlightInfo != null && highlightTrans == null) { Destroy(); return false; } if (!CheckViewValid()) { Destroy(); return false; } if (highlightTrans != null) { playHighlightAnim = true; } SetupDisableInput(); SetupMask(); SetupGuideImage(); SetReferredContext(); if (delayShowTime > 0f && Singleton.Instance != null) { _delayShowCoroution = Singleton.Instance.StartCoroutine(WaitSetup()); } else { SetupBubble(); SetupHandIcon(); HighlightView(); SetupSkip(); } return false; } public override void Destroy() { if (!_hasDestroied) { _hasDestroied = true; base.Destroy(); StopDelayShowCoroution(); StopHandIconAnim(); StopHighlightEffectCoroutine(); StopDelayInputCoroution(); StopDestroyCoroution(); RecoverHighlightView(); if (_hasClicked && destroyButHasClickedCallback != null) { destroyButHasClickedCallback(); } if (!_hasClicked && destroyButNoClickedCallback != null) { destroyButNoClickedCallback(); } if (destroyCallback != null) { destroyCallback(); } } } public override bool NeedRecoverWhenPageStartUp() { return false; } public override void SetActive(bool enabled) { playHighlightAnim = enabled; SetHighlightEffectActive(enabled); base.SetActive(enabled); if (!enabled && !_waitDestroy) { Destroy(); } } public void SetAvailable(bool available) { playHighlightAnim = available; SetHighlightEffectActive(available); if (available) { CanvasGroup component = base.view.transform.GetComponent(); if (component != null) { UnityEngine.Object.Destroy(component); } return; } CanvasGroup canvasGroup = base.view.transform.GetComponent(); if (canvasGroup == null) { canvasGroup = base.view.AddComponent(); } canvasGroup.alpha = 0f; canvasGroup.blocksRaycasts = false; } private IEnumerator WaitDestroy() { yield return null; _destroyCoroutine = null; Destroy(); } private IEnumerator WaitSetup() { yield return new WaitForSeconds(delayShowTime); if (base.view == null || base.view.transform == null) { Destroy(); yield break; } SetupBubble(); SetupHandIcon(); HighlightView(); SetupSkip(); _delayShowCoroution = null; } private bool CheckViewValid() { return !disableMask || !(highlightTrans == null); } private void SetReferredContext() { if (!(highlightTrans == null) && !(highlightTrans.gameObject == null)) { ContextIdentifier componentInParent = highlightTrans.gameObject.GetComponentInParent(); if (componentInParent != null) { referredContext = componentInParent.context; } } } private void SetupDisableInput() { if (delayInputTime < 0.1f && handIconPosType == HandIconPosType.None) { delayInputTime = 1f; } if (delayInputTime > 0f && Singleton.Instance != null) { _delayInputCoroutine = Singleton.Instance.StartCoroutine(WaitEnableInput()); return; } Transform transform = base.view.transform.Find("DisableInput"); transform.gameObject.SetActive(false); } private IEnumerator WaitEnableInput() { yield return new WaitForSeconds(delayInputTime); Transform disableInputTrans = base.view.transform.Find("DisableInput"); disableInputTrans.gameObject.SetActive(false); _delayInputCoroutine = null; } private void SetupReward() { _animationManager = new SequenceAnimationManager(OnAllBoxAnimationEnd); if (bShowReward) { _bRewardClicked = false; base.view.transform.Find("Reward").gameObject.SetActive(true); highlightTrans = base.view.transform.Find("Reward/Button"); BindViewCallback(highlightTrans, EventTriggerType.PointerClick, OnRewardPreCallback); BindViewCallback(highlightTrans, EventTriggerType.PointerClick, OnRewardClick); RewardData rewardDataByKey = RewardDataReader.GetRewardDataByKey(rewardID); Transform transform = base.view.transform.Find("Reward/Content/1"); transform.gameObject.SetActive(false); Transform transform2 = base.view.transform.Find("Reward/Content/2"); transform2.gameObject.SetActive(false); Transform transform3 = base.view.transform.Find("Reward/Content/3"); transform3.gameObject.SetActive(false); Transform item = transform.Find("Item"); Transform item2 = transform2.Find("Item"); Transform item3 = transform3.Find("Item"); List list = new List(); list.Add(transform); list.Add(transform2); list.Add(transform3); List list2 = list; list = new List(); list.Add(item); list.Add(item2); list.Add(item3); List list3 = list; List rewardUIDataList = GetRewardUIDataList(rewardDataByKey); for (int i = 0; i < rewardUIDataList.Count; i++) { if (i < list2.Count) { Transform transform4 = list2[i]; Transform transform5 = list3[i]; transform4.gameObject.SetActive(true); _animationManager.AddAnimation(transform4.GetComponent()); RewardUIData rewardUIData = rewardUIDataList[i]; if (rewardUIData.rewardType == ResourceType.Item) { StorageDataItemBase dummyStorageDataItem = Singleton.Instance.GetDummyStorageDataItem(rewardUIData.itemID, rewardUIData.level); dummyStorageDataItem.number = rewardUIData.value; transform5.GetComponent().SetupView(dummyStorageDataItem, null, true); } else { HideRewardTransSomePart(transform5); transform5.GetComponent().Clear(); transform5.Find("ItemIcon/ItemIcon/Icon").GetComponent().sprite = Miscs.GetSpriteByPrefab(rewardUIData.iconPath); transform5.Find("BG").gameObject.SetActive(true); transform5.Find("BG/Desc").GetComponent().text = "x" + rewardUIData.value; } } } } else { base.view.transform.Find("Reward").gameObject.SetActive(false); } } private List GetRewardUIDataList(RewardData rewardData) { List list = new List(); if (rewardData.RewardExp > 0) { RewardUIData playerExpData = RewardUIData.GetPlayerExpData(rewardData.RewardExp); playerExpData.itemID = rewardData.RewardID; list.Add(playerExpData); } if (rewardData.RewardSCoin > 0) { RewardUIData scoinData = RewardUIData.GetScoinData(rewardData.RewardSCoin); scoinData.itemID = rewardData.RewardID; list.Add(scoinData); } if (rewardData.RewardHCoin > 0) { RewardUIData hcoinData = RewardUIData.GetHcoinData(rewardData.RewardHCoin); hcoinData.itemID = rewardData.RewardID; list.Add(hcoinData); } if (rewardData.RewardStamina > 0) { RewardUIData staminaData = RewardUIData.GetStaminaData(rewardData.RewardStamina); staminaData.itemID = rewardData.RewardID; list.Add(staminaData); } if (rewardData.RewardSkillPoint > 0) { RewardUIData skillPointData = RewardUIData.GetSkillPointData(rewardData.RewardSkillPoint); skillPointData.itemID = rewardData.RewardID; list.Add(skillPointData); } if (rewardData.RewardFriendPoint > 0) { RewardUIData friendPointData = RewardUIData.GetFriendPointData(rewardData.RewardFriendPoint); friendPointData.itemID = rewardData.RewardID; list.Add(friendPointData); } if (rewardData.RewardItem1ID > 0) { RewardUIData item = new RewardUIData(ResourceType.Item, rewardData.RewardItem1Num, RewardUIData.ITEM_ICON_TEXT_ID, string.Empty, rewardData.RewardItem1ID, rewardData.RewardItem1Level); list.Add(item); } if (rewardData.RewardItem2ID > 0) { RewardUIData item2 = new RewardUIData(ResourceType.Item, rewardData.RewardItem2Num, RewardUIData.ITEM_ICON_TEXT_ID, string.Empty, rewardData.RewardItem2ID, rewardData.RewardItem2Level); list.Add(item2); } if (rewardData.RewardItem3ID > 0) { RewardUIData item3 = new RewardUIData(ResourceType.Item, rewardData.RewardItem3Num, RewardUIData.ITEM_ICON_TEXT_ID, string.Empty, rewardData.RewardItem3ID, rewardData.RewardItem3Level); list.Add(item3); } if (rewardData.RewardItem4ID > 0) { RewardUIData item4 = new RewardUIData(ResourceType.Item, rewardData.RewardItem4Num, RewardUIData.ITEM_ICON_TEXT_ID, string.Empty, rewardData.RewardItem4ID, rewardData.RewardItem4Level); list.Add(item4); } if (rewardData.RewardItem5ID > 0) { RewardUIData item5 = new RewardUIData(ResourceType.Item, rewardData.RewardItem5Num, RewardUIData.ITEM_ICON_TEXT_ID, string.Empty, rewardData.RewardItem5ID, rewardData.RewardItem5Level); list.Add(item5); } return list; } private void HideRewardTransSomePart(Transform rewardTrans) { rewardTrans.Find("BG/UnidentifyText").gameObject.SetActive(false); rewardTrans.Find("NewMark").gameObject.SetActive(false); rewardTrans.Find("AvatarStar").gameObject.SetActive(false); rewardTrans.Find("Star").gameObject.SetActive(false); rewardTrans.Find("StigmataType").gameObject.SetActive(false); rewardTrans.Find("FragmentIcon").gameObject.SetActive(false); } private void OnRewardPreCallback(BaseEventData data = null) { OnNewbieMaskPreCallback(data); } private void OnRewardClick(BaseEventData data = null) { if (!_bRewardClicked) { Singleton.Instance.RequestGuideReward(guideID); _bRewardClicked = true; } } private bool OnGetGuideRewardRsp(GetGuideRewardRsp rsp) { _animationManager.StartPlay(); return false; } private void OnAllBoxAnimationEnd() { if (Singleton.Instance != null) { Singleton.Instance.StartCoroutine(RewardDelayClick()); } } private IEnumerator RewardDelayClick() { yield return new WaitForSeconds(0.8f); OnNewbieMaskClick(); } private void SetupMask() { Transform transform = base.view.transform.Find("Mask"); transform.GetComponent().enabled = !disableMask; if ((!disableMask && highlightTrans == null) || isMaskClickable || handIconPosType == HandIconPosType.None || handIconPosType == HandIconPosType.Arrow) { BindViewCallback(transform, EventTriggerType.PointerClick, OnNewbieMaskPreCallback); BindViewCallback(transform, EventTriggerType.PointerClick, OnNewbieMaskClick); } } private void SetupGuideImage() { if (guideSprite != null) { Transform transform = base.view.transform.Find("GuideImage"); transform.gameObject.SetActive(true); transform.GetComponent().sprite = guideSprite; } } private void SetupSkip() { if (!(base.view == null) && !(base.view.transform == null)) { Transform transform = base.view.transform.Find("Skip"); transform.gameObject.SetActive(bShowSkip); if (bShowSkip) { BindViewCallback(transform.GetComponent