using IVDataFormat; using IVServerFormat; using TMPro; using UnityEngine; public class MailMgr : MonoBehaviour { #region Const private static MailMgr curMgr = null; #endregion Const #region UI [Header("UI")] [SerializeField] private TextMeshProUGUI txtMainT; private GameObject goMainBadge; [SerializeField] private GameObject goUpBadge; [SerializeField] private Canvas canvasUI; private ButtonIV[] btnTabs; [SerializeField] private EScrController escrMail; private ButtonIV btnGetAll; private TextMeshProUGUI txtMailEmpty, txtMailDesc; [SerializeField] private Sprite sprLetterClose, sprLetterOpen; #endregion UI #region Variables private int iLoading = 1; private bool bReLocalize = true; private bool bReLocalizeMail = false; private int iSelectedTab = -1; private int iSvType = -1; private int iMailLoading = 0; private bool bUpdateMail = true; private EnhancedUI.SmallList mails; private EnhancedUI.SmallList reads; #endregion Variables #region Base public static void SLocalize(bool bmain) { if (curMgr != null) curMgr.Localize(bmain); } // 번역. private void Localize(bool bmain) { if (bmain) { txtMainT.text = LocalizationText.GetText("mail_title"); goMainBadge = txtMainT.transform.parent.Find("badge").gameObject; btnGetAll = canvasUI.transform.Find("btnGetAll").GetComponent(); } else { bReLocalize = false; Transform trfcanvas = canvasUI.transform; trfcanvas.Find("txtT").GetComponent().text = LocalizationText.GetText("mail_title"); btnTabs = new ButtonIV[2]; btnTabs[0] = trfcanvas.Find("tabMail").GetComponent(); btnTabs[1] = trfcanvas.Find("tabRead").GetComponent(); btnTabs[0].transform.Find("txt").GetComponent().text = LocalizationText.GetText("mail_unread"); btnTabs[1].transform.Find("txt").GetComponent().text = LocalizationText.GetText("mail_read"); btnGetAll.transform.Find("txt").GetComponent().text = LocalizationText.GetText("all_getall"); txtMailEmpty = trfcanvas.Find("txtEmpty").GetComponent(); trfcanvas.Find("txtDesc1").GetComponent().text = LocalizationText.GetText("mail_msgcnt"); txtMailDesc = trfcanvas.Find("txtDesc2").GetComponent(); // 읽지 않은 우편. if (iSelectedTab == 0) { txtMailEmpty.text = LocalizationText.GetText("mail_unreadempty"); txtMailDesc.text = LocalizationText.GetText("mail_msgunread"); } // 읽은 우편. else { txtMailEmpty.text = LocalizationText.GetText("mail_readempty"); txtMailDesc.text = LocalizationText.GetText("mail_msgread"); } } } // 설정에서 언어 변경 시 처리. public static void SReLocalize() { curMgr.Localize(true); curMgr.bReLocalize = true; curMgr.bReLocalizeMail = true; } // 백버튼 처리. public static bool SCloseMenu() { return curMgr.CloseMenu(); } private bool CloseMenu() { // 게임 시작 후 열린적 없음. if (iSelectedTab < 0) return false; if (canvasUI.enabled) { CloseMail(); return true; } return false; } private void Awake() { curMgr = this; } void Start() { iLoading--; } #endregion Base #region UI // 우편함 열기. public void OpenMail() { GameUIMgr.SAllOffDownMenu(); if (iLoading > 0) return; iLoading++; if (bReLocalize) Localize(false); if (iSelectedTab < 0) { mails = new EnhancedUI.SmallList(); reads = new EnhancedUI.SmallList(); escrMail.LoadDatas(mails); TabPress(0); } else if (iSelectedTab == 0) { // 우편 목록 갱신. if (!RefreshMailList()) { RemoveLimitOverMail(); UpdateMailList(false); } } if (bReLocalizeMail) { bReLocalizeMail = false; escrMail.Localize(); escrMail.scroller.RefreshActiveCellViews(); } canvasUI.enabled = true; SoundMgr.Instance.PlaySfx(SoundName.BtnPress); iLoading--; } // 우편함 닫기. public void CloseMail() { if (!canvasUI.enabled) return; if (iLoading > 0) return; iLoading++; canvasUI.enabled = false; SoundMgr.Instance.PlaySfx(SoundName.BtnPress); iLoading--; } // 닫힌 우편 아이콘. public static Sprite SGetIconClose() { return curMgr.sprLetterClose; } // 열린 우편 아이콘. public static Sprite SGetIconOpen() { return curMgr.sprLetterOpen; } #endregion UI #region Tab public void TabPress(int index) { if (iSelectedTab == index) return; iLoading++; if (iSelectedTab >= 0) { btnTabs[iSelectedTab].interactable = true; } iSelectedTab = index; btnTabs[iSelectedTab].interactable = false; // 읽지 않은 우편. if (iSelectedTab == 0) { iSvType = 0; escrMail.SetType(iSvType); txtMailEmpty.text = LocalizationText.GetText("mail_unreadempty"); txtMailDesc.text = LocalizationText.GetText("mail_msgunread"); btnGetAll.gameObject.SetActive(true); escrMail.LoadDatas(mails); if (!RefreshMailList()) { RemoveLimitOverMail(); UpdateMailList(false); } } // 읽은 우편. else { iSvType = 1; escrMail.SetType(iSvType); txtMailEmpty.text = LocalizationText.GetText("mail_readempty"); txtMailDesc.text = LocalizationText.GetText("mail_msgread"); btnGetAll.gameObject.SetActive(false); if (!RefreshReadList()) { UpdateReadList(); } } SoundMgr.Instance.PlaySfx(SoundName.BtnPress); iLoading--; } #endregion Tab #region Read List // 우편 내역 표시 갱신. private void UpdateReadList() { int ilen = DataHandler.GetMailReads().Length; txtMailEmpty.gameObject.SetActive(ilen == 0); while (ilen < reads.Count) { reads.RemoveEnd(); } while (ilen > reads.Count) { reads.Add(reads.Count); } escrMail.LoadDatas(reads); } // 우편 내역 갱신. private bool RefreshReadList() { if (DataHandler.MailReadRefreshTime > TimeUtils.Now()) return false; iMailLoading++; CoverCamera.Hold(); SvConnectManager.Instance.RequestSvGet(true, 0, UrlApi.GetUrl(UrlApi.MailReadList), typeof(nMailRefreshReturn), AReadRefreshSucc, AReadRefreshFail, false); return true; } // 통신 성공 - 우편 내역 갱신. private void AReadRefreshSucc(object result) { nMailRefreshReturn data = result as nMailRefreshReturn; if (data == null || data.playMail == null) { AReadRefreshFail(new SvError(eErrorCode.NULL_OR_EMPTY)); return; } DataHandler.LoadMailRead(data.playMail, true); bUpdateMail = true; UpdateReadList(); CoverCamera.Release(); iMailLoading--; } // 통신 실패 - 우편 내역 갱신. private void AReadRefreshFail(SvError error) { CoverCamera.Release(); iMailLoading--; } #endregion Read List #region Mail List // 우편 목록 표시 갱신. private void UpdateMailList(bool bstaypos) { int ilen = DataHandler.GetMails().Length; txtMailEmpty.gameObject.SetActive(ilen == 0); if (!bUpdateMail) { escrMail.scroller.RefreshActiveCellViews(); return; } bUpdateMail = false; while (ilen < mails.Count) { mails.RemoveEnd(); } while (ilen > mails.Count) { mails.Add(mails.Count); } if (bstaypos && escrMail.scroller.ScrollSize != 0) escrMail.scroller.ReloadData(escrMail.scroller.ScrollPosition / escrMail.scroller.ScrollSize); else escrMail.scroller.ReloadData(); } // 우편 수 갱신. public static void SSetBadgeAndRecieveAllButton() { curMgr.goMainBadge.SetActive(DataHandler.MailCount > 0); curMgr.goUpBadge.SetActive(curMgr.goMainBadge.activeSelf); curMgr.btnGetAll.interactable = curMgr.goMainBadge.activeSelf; } // 우편 수 임의 갱신. 상점 아이템 구매 후 등 수령할 우편이 생기면 호출. public static void SAddMailCount() { DataHandler.SetMailCount(DataHandler.MailCount + 1); curMgr.goMainBadge.SetActive(true); curMgr.goUpBadge.SetActive(curMgr.goMainBadge.activeSelf); curMgr.btnGetAll.interactable = true; } #endregion Mail List #region Mail Limit Remove & List Reload // 만료 우편 수동 제거. private void RemoveLimitOverMail() { int iover = 0; dMail[] curmails = DataHandler.GetMails(); for (int i = 0; i < curmails.Length; i++) { if (curmails[i].endAt <= TimeUtils.Now()) { iover++; } } if (iover == 0) return; bUpdateMail = true; int curindex = 0; dMail[] mails = new dMail[curmails.Length - iover]; for (int i = 0; i < curmails.Length; i++) { if (curindex >= mails.Length) break; if (curmails[i].endAt <= TimeUtils.Now()) continue; mails[curindex] = curmails[i]; curindex++; } DataHandler.LoadMail(mails, true, false); } // 우편 목록 갱신. private bool RefreshMailList() { if (DataHandler.MailRefreshTime > TimeUtils.Now()) return false; iMailLoading++; CoverCamera.Hold(); SvConnectManager.Instance.RequestSvGet(true, 0, UrlApi.GetUrl(UrlApi.MailList), typeof(nMailRefreshReturn), AMailRefreshSucc, AMailRefreshFail, false); return true; } // 통신 성공 - 우편 목록 갱신. private void AMailRefreshSucc(object result) { nMailRefreshReturn data = result as nMailRefreshReturn; if (data == null || data.playMail == null) { AMailRefreshFail(new SvError(eErrorCode.NULL_OR_EMPTY)); return; } DataHandler.LoadMail(data.playMail, true, true); bUpdateMail = true; UpdateMailList(false); DataHandler.SetMailCount(data.playMail.Length); SSetBadgeAndRecieveAllButton(); CoverCamera.Release(); iMailLoading--; } // 통신 실패 - 우편 목록 갱신. private void AMailRefreshFail(SvError error) { CoverCamera.Release(); iMailLoading--; } #endregion Mail Limit Remove & List Reload #region Get public static void SGetMailItem(int index) { if (curMgr != null) curMgr.GetMailItem(index); } // 우편 아이템 획득. private void GetMailItem(int index) { if (iMailLoading > 0) return; dMail mail = DataHandler.GetMailByIndex(index); if (mail == null || mail.endAt <= TimeUtils.Now()) { RemoveLimitOverMail(); UpdateMailList(true); return; } iMailLoading++; CoverCamera.Hold(); SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.MailReadOne), typeof(nMailGetReturn), AMailGetSucc, AMailGetFail, new nIdStr(mail.id), false); } // 통신 실패 - 우편 아이템 획득. private void AMailGetFail(SvError error, object request) { CoverCamera.Release(); iMailLoading--; } // 통신 성공 - 우편 아이템 획득. private void AMailGetSucc(object result, object request) { nMailGetReturn data = result as nMailGetReturn; if (data == null || data.playCurrency == null || data.playMail == null) { AMailGetFail(new SvError(eErrorCode.NULL_OR_EMPTY), request); return; } DataHandler.AddGoods(data.result, data.playCurrency, true); DataHandler.SaveData(); DataHandler.LoadMail(data.playMail, true, true); GameUIMgr.SOpenPopupGoods(data.result, null, LocalizationText.GetText("mail_get")); bUpdateMail = true; UpdateMailList(true); DataHandler.UpdateMailReadTime(); DataHandler.SetMailCount(data.playMail.Length); SSetBadgeAndRecieveAllButton(); CoverCamera.Release(); iMailLoading--; } public void BtnGetAll() { if (iMailLoading > 0) return; iMailLoading++; CoverCamera.Hold(); dMail[] curmails = DataHandler.GetMails(); int icnt = 0; for (int i = 0; i < curmails.Length; i++) { if (curmails[i] == null || curmails[i].endAt <= TimeUtils.Now()) continue; icnt++; } if (icnt == 0) { GameUIMgr.SOpenPopup1Button(LocalizationText.GetText("msg_nomail")); CoverCamera.Release(); iMailLoading--; return; } SoundMgr.Instance.PlaySfx(SoundName.BtnPress); SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.MailReadAll), typeof(nMailGetReturn), AMailGetAllSucc, AMailGetAllFail, new nIdCnt(), false); } // 통신 실패 - 전체 아이템 획득. private void AMailGetAllFail(SvError error, object request) { CoverCamera.Release(); iMailLoading--; } // 통신 성공 - 전체 아이템 획득. private void AMailGetAllSucc(object result, object request) { nMailGetReturn data = result as nMailGetReturn; nIdlLv requestdata = request as nIdlLv; if (data == null || data.playCurrency == null || data.playMail == null) { AMailGetAllFail(new SvError(eErrorCode.NULL_OR_EMPTY), request); return; } DataHandler.AddGoods(data.result, data.playCurrency, true); DataHandler.SaveData(); DataHandler.LoadMail(data.playMail, true, true); GameUIMgr.SOpenPopupGoods(data.result, null, LocalizationText.GetText("mail_get")); bUpdateMail = true; UpdateMailList(true); DataHandler.UpdateMailReadTime(); DataHandler.SetMailCount(data.playMail.Length); SSetBadgeAndRecieveAllButton(); CoverCamera.Release(); iMailLoading--; } #endregion Get }