using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using MMO; public partial class MMOModule : MonoBehaviour { public event Action OnEnter; public event Action OnExit; public event Action OnDataOverride; public event Action OnDiamondUpdate; //inner sdk public event Action> OnShowRV; public event Action OnShowIV; public event Action OnLogEvent; public event Func OnGetConfig; public event Action OnShare; public event Action OnOpenMoreGames; private Action mDelCheckOver; public bool IsGuideFinished => MMOUserData.Instance.IsGuideFinished; public bool IsAccessible => MMOConstConfig.Instance.IsEnabled && (MMOUserData.Instance.IsMMOUser || MMOUserData.Instance.HasBeenInvited); public bool IsInvitable => MMOConstConfig.Instance.IsEnabled && !IsAccessible && MMOInnerSDKManager.Instance.GetConfigBool(MMOConstConfig.Instance.InvitableParam); private static MMOModule mInstance = null; public static MMOModule Instance { get { if (mInstance == null) { GameObject tMMOGO = Instantiate(Resources.Load(nameof(MMOModule))) as GameObject; mInstance = tMMOGO.AddComponent(); tMMOGO.SetActive(true); DontDestroyOnLoad(tMMOGO); } return mInstance; } } private MMOUIManager mUIMgr; public MMOUIManager UIMgr { get { if (mUIMgr == null) { mUIMgr = GetComponentInChildren(true); } return mUIMgr; } } private bool mIsOn = false; private void OnApplicationFocus(bool pFocus) { if (pFocus) { if (MMOConstConfig.Instance.IsEnabled) { if (Application.internetReachability == NetworkReachability.NotReachable) { UIMgr.OpenUI(); } else { UIMgr.CloseUI(); #if !UNITY_EDITOR RequestInitData(UIMgr.GetUI().NotifyInitOver); #endif } } else if (MMOConstConfig.Instance.KeepLoading) { UIMgr.GetUI().NotifyInitOver(); } } } private void RequestInitData(Action pDelSyncDone = null) { if (MMOConstConfig.Instance.IsEnabled) { MMOAPIRequestManager.Instance.SendRequest(new MMORequestLogin(), (pRespond) => { MMOAPIRequestManager.Instance.SetData(pRespond); MMODataSyncManager.Instance.SyncUserData(); pDelSyncDone?.Invoke(); MMOAPIRequestManager.Instance.SendRequest(new MMORequestInviteProgress(pRespond.MyInviteCode), (pRp) => { MMOAPIRequestManager.Instance.SetData(pRp); }); }); } } public void EnableMMO(bool pEnable, bool pKeepLoading = false) { MMOConstConfig.Instance.IsEnabled = pEnable; MMOConstConfig.Instance.KeepLoading = pEnable ? true : pKeepLoading; } public void Init(Action pDelInitOver) { if (!MMOConstConfig.Instance.IsEnabled) { if (MMOConstConfig.Instance.KeepLoading) { MMOUILoading tLoading = UIMgr.OpenUI(); tLoading.DelInitOver = pDelInitOver; return; } pDelInitOver?.Invoke(); return; } //Inner SDK Delegate MMOInnerSDKManager.Instance.DelShowRV = ShowRV; MMOInnerSDKManager.Instance.DelShowIV = ShowIV; MMOInnerSDKManager.Instance.DelLogEvent = LogEvent; MMOInnerSDKManager.Instance.DelGetConfig = GetConfig; MMOInnerSDKManager.Instance.DelShare = Share; MMOInnerSDKManager.Instance.DelOpenMoreGames = OpenMoreGames; //data MMODataSyncManager.Instance.DelDataOverride = DataOverride; MMOUserData.Instance.DelUpdateDiamond = UpdateDiamond; MMOUserData.Instance.DelUpdateLevel = UpdateLevel; MMOUserData.Instance.CheckTask(); MMOUILoading tUILoading = UIMgr.OpenUI(); tUILoading.DelInitOver = pDelInitOver; tUILoading.DelLoadOver = OnLoadOver; RequestInitData(); } public void StartGame(Action pDelCheckOver, bool pIsMMOUser, int pDiamond, int pLevel) { if (!MMOConstConfig.Instance.IsEnabled) { if (MMOConstConfig.Instance.KeepLoading) { MMOUILoading tLoading = UIMgr.GetUI(); if (tLoading.IsOpened) { tLoading.DelLoadOver = pDelCheckOver; tLoading.FinishRest(); } else { pDelCheckOver?.Invoke(); } MMOUserData.Instance.FinishLoading(); return; } pDelCheckOver?.Invoke(); return; } mDelCheckOver = pDelCheckOver; MMOUserData.Instance.IsMMOUser = pIsMMOUser; MMOUserData.Instance.Diamond = pDiamond; MMOUserData.Instance.GameLevel = pLevel; if (UIMgr.GetUI().IsOpened) { UIMgr.GetUI().FinishRest(); } else { CheckGuide(); } } public void LogMMOUser(bool pIsMMO) { MMOInnerSDKManager.Instance.LogEvent("Robux_" + pIsMMO); } private void OnLoadOver() { MMOUserData.Instance.FinishLoading(); CheckGuide(); } private void CheckGuide() { if (MMOConstConfig.Instance.IsEnabled && MMOUserData.Instance.IsMMOUser && !MMOUserData.Instance.IsGuideFinished) { if (!MMOUserData.Instance.HasFirstSubmitted) { ShowFirstFill(); } else { ShowGuide(); } } else { MMOInnerSDKManager.Instance.LogUserType(MMOEventValue.Organic); mDelCheckOver?.Invoke(); } } private void ShowFirstFill() { SetIsOn(true); MMOUIFirstFill tUI = UIMgr.OpenUI(); tUI.DelSubmit = ShowGuide; tUI.DelClose = Exit; } private void ShowGuide() { SetIsOn(true); UIMgr.OpenUI().DelClose = OnGuideOver; } private void OnGuideOver() { mDelCheckOver?.Invoke(); Exit(); } private void SetIsOn(bool pIsOn) { mIsOn = pIsOn; if (pIsOn) { OnEnter?.Invoke(); } else { OnExit?.Invoke(); } } public void Enter(int pDiamond, int pGameLevel, int pPartIndex = 0)//0 task,1 skin { MMOUserData.Instance.Diamond = pDiamond; MMOUserData.Instance.GameLevel = pGameLevel; UIMgr.OpenUI(); UIMgr.OpenUI().ShowPart(pPartIndex); MMOInnerSDKManager.Instance.LogRobuxAction(MMOEventValue.EnterMMO); SetIsOn(true); } public void Exit() { UIMgr.CloseUI(); SetIsOn(false); } public bool PopVerifyInvitation(Action pDelInvited) { if (!IsInvitable) return false; MMOUIInviteVerify tUI = UIMgr.OpenUI(); tUI.DelInvited = pDelInvited; tUI.DelClose = Exit; SetIsOn(true); return true; } public void ShowTip(string pTipString) { if (mIsOn) { UIMgr.OpenUI().SetTip(pTipString); } } public void PassLevel(int pCurrentLevel, Action pDelGetDiamond, Action pDelOver) { if (!IsAccessible) { pDelOver?.Invoke(); return; } for (int i = 0; i < MMOUserData.Instance.TaskRecordList.Count; i++) { MMOTaskRecord tRecord = MMOUserData.Instance.TaskRecordList[i]; if (tRecord.TaskType == MMOTaskType.DailyLevel && !MMOUserData.Instance.HasFinishedTaskToday(tRecord.TaskType)) { int tValue = MMOUserData.Instance.GetTaskValue(tRecord.RecordKey); MMOUserData.Instance.SetTaskValue(tRecord.RecordKey, tValue + 1); } } MMOAPIRequestManager.Instance.SendRequest(new MMORequestSetLevel(pCurrentLevel)); //check bonus level List tBonusPopLevels = new List(); string tBonusLevelStr = MMOInnerSDKManager.Instance.GetConfigString(MMOConstConfig.Instance.BonusLevelParam); if (!string.IsNullOrEmpty(tBonusLevelStr)) { tBonusPopLevels.Clear(); string[] tLevelStrs = tBonusLevelStr.Split(','); int tLevel = 0; for (int i = 0; i < tLevelStrs.Length; i++) { if (int.TryParse(tLevelStrs[i], out tLevel)) { tBonusPopLevels.Add(tLevel); } } } //check skin piece bool tIsSkinPieceLevel = (pCurrentLevel <= 30 && pCurrentLevel % 3 == 0) || (pCurrentLevel > 30 && pCurrentLevel <= 60 && pCurrentLevel % 5 == 0) || (pCurrentLevel > 60 && pCurrentLevel % 10 == 0); if (tBonusPopLevels.Contains(pCurrentLevel)) { PopBonus(pDelGetDiamond, pDelOver); } else if (tIsSkinPieceLevel) { PopSkinPiece(pDelOver); } else { pDelOver?.Invoke(); } } private void PopBonus(Action pDelGetDiamond, Action pDelOver) { if (!IsAccessible || !MMOUserData.Instance.HasRegistered) { pDelOver?.Invoke(); return; } MMOUIBonus tUI = UIMgr.OpenUI(); tUI.DelGetDiamond = pDelGetDiamond; tUI.DelClose = () => { pDelOver?.Invoke(); Exit(); }; SetIsOn(true); } private void PopSkinPiece(Action pDelOver) { if (!IsAccessible || !MMOUserData.Instance.HasRegistered) { pDelOver?.Invoke(); return; } Dictionary tPickDic = new Dictionary(); MMODataSkin tData; int tOwnCount = 0; for (int i = MMOTableSkin.Instance.Count - 1; i >= 0; i--) { tData = MMOTableSkin.Instance[i]; tOwnCount = MMOUserData.Instance.GetSkinPieceCount(tData.SkinID); if (tOwnCount < tData.MaxCount) { tPickDic.Add(tData.SkinID, tData.Ratio); } } if (tPickDic.Count == 0) { pDelOver?.Invoke(); return; } int tPickedID = MMOUtils.RandomPick(tPickDic); //Debug.Log("tPicked ID :" + tPickedID); MMODataSkin tPickedData = MMOTableSkin.Instance.GetData(tPickedID); tOwnCount = MMOUserData.Instance.GetSkinPieceCount(tPickedID); int tAddCount = tOwnCount >= tPickedData.ReduceCount ? 2 : 10; MMOUserData.Instance.AddSkinPieceCount(tPickedID, tAddCount); MMOUISkinPiece tUI = UIMgr.OpenUI(); tUI.ConfigSkin(tPickedData, tAddCount); tUI.DelClose = () => { pDelOver?.Invoke(); Exit(); }; SetIsOn(true); } public void RewardGet(bool pIsMore) { MMOInnerSDKManager.Instance.LogResultPage(pIsMore ? MMOEventValue.More_Get : MMOEventValue.Normal_Get); } public void WatchRVSuccessfully() { if (!IsAccessible) return; for (int i = 0; i < MMOUserData.Instance.TaskRecordList.Count; i++) { MMOTaskRecord tRecord = MMOUserData.Instance.TaskRecordList[i]; if (tRecord.TaskType == MMOTaskType.WatchRV || (tRecord.TaskType == MMOTaskType.DailyAds && !MMOUserData.Instance.HasFinishedTaskToday(tRecord.TaskType))) { int tValue = MMOUserData.Instance.GetTaskValue(tRecord.RecordKey); MMOUserData.Instance.SetTaskValue(tRecord.RecordKey, tValue + 1); } else if (tRecord.TaskType == MMOTaskType.RiseRank) { int tValue = MMOUserData.Instance.GetTaskValue(tRecord.RecordKey); MMOUserData.Instance.SetTaskValue(tRecord.RecordKey, tValue + 50); } } UIMgr.GetUI().RefreshTask(); } public void SetTaskValue(MMOTaskType pType, int pValue) { if (!IsAccessible) return; for (int i = 0; i < MMOUserData.Instance.TaskRecordList.Count; i++) { MMOTaskRecord tRecord = MMOUserData.Instance.TaskRecordList[i]; if (tRecord.TaskType == pType) { MMOUserData.Instance.SetTaskValue(tRecord.RecordKey, pValue); } } } public int GetRewardDiamondOfLevel(int pDiamond, int pLevel) { int tTarget = 0; for (int i = 0; i < MMOUserData.Instance.TaskRecordList.Count; i++) { if (MMOUserData.Instance.TaskRecordList[i].TaskType == MMOTaskType.GetDiamond) { if (!MMOUserData.Instance.TaskRecordList[i].IsFinished) { tTarget = MMOUserData.Instance.TaskRecordList[i].TargetNum; } } } if (tTarget == 0) { return 1000; } int tFinalDiamond = 1; int tCurLevelDiamond = 1; MMODataLevelDiamond tData = MMOTableLevelDiamond.Instance.GetData(pLevel); if (tData != null) { tCurLevelDiamond = tData.Diamond; } int tExpectedMaxDiamond = pDiamond + (pLevel > 3 ? tCurLevelDiamond * 3 : tCurLevelDiamond); if (tExpectedMaxDiamond < tTarget - 200) { tFinalDiamond = tCurLevelDiamond; } else { if (pDiamond < tTarget - 200) { tFinalDiamond = Mathf.Max((tTarget - 200 - pDiamond) / 3, 10); } else if (pDiamond >= (tTarget - 200) && pDiamond < (tTarget - 100)) { tFinalDiamond = 10; } else if (pDiamond >= (tTarget - 100) && pDiamond < (tTarget - 50)) { tFinalDiamond = 3; } } //int tStuckDiamond = 200; //int tStuckLevel = 146; //int tCurLevelDiamond = 1; //MMODataLevelDiamond tData = MMOTableLevelDiamond.Instance.GetData(pLevel); //if (tData != null) //{ // tCurLevelDiamond = tData.Diamond; //} //if (pLevel > 3 && pLevel <= 50 &&(pDiamond + tCurLevelDiamond * 3) >= tTarget) //{ // tCurLevelDiamond /= 6; // tStuckLevel = 50; //} //int tLeftDiamond = tTarget - (pDiamond + tCurLevelDiamond); //int tLeftLevel = Mathf.Max(tStuckLevel - pLevel, 1); //if (tLeftDiamond <= tStuckDiamond && pLevel <= tStuckLevel) //{ // tFinalDiamond = Mathf.Max(tLeftDiamond / tLeftLevel / 3, 1); //} //else //{ // tFinalDiamond = tCurLevelDiamond; //} return Mathf.Max(tFinalDiamond, 1); } private void UpdateDiamond(int pDiamond) { OnDiamondUpdate?.Invoke(pDiamond); UIMgr.GetUI().DiamondBar.RefreshRes(pDiamond); for (int i = 0; i < MMOUserData.Instance.TaskRecordList.Count; i++) { MMOTaskRecord tRecord = MMOUserData.Instance.TaskRecordList[i]; if (tRecord.TaskType == MMOTaskType.GetDiamond) { MMOUserData.Instance.SetTaskValue(tRecord.RecordKey, pDiamond); } } } private void UpdateLevel(int pLevel) { for (int i = 0; i < MMOUserData.Instance.TaskRecordList.Count; i++) { MMOTaskRecord tRecord = MMOUserData.Instance.TaskRecordList[i]; if (tRecord.TaskType == MMOTaskType.PassLevel) { MMOUserData.Instance.SetTaskValue(tRecord.RecordKey, pLevel); } } } #region Inner SDK private void ShowRV(string pPos, Action pDelResult) { OnShowRV?.Invoke(pPos, pDelResult); } private void ShowIV(string pPos) { OnShowIV?.Invoke(pPos); } private void LogEvent(string pEvent, string pParam, string pValue) { OnLogEvent?.Invoke(pEvent, pParam, pValue); } private string GetConfig(string pKey) { return OnGetConfig?.Invoke(pKey); } private void Share(string pContent) { OnShare?.Invoke(pContent); } private void OpenMoreGames() { OnOpenMoreGames?.Invoke(); } #endregion private void DataOverride() { OnDataOverride?.Invoke(); } public void DeleteAccount(Action pDelResult = null) { MMORespondLogin tLoginData = MMOAPIRequestManager.Instance.GetData(); if (tLoginData != null) { MMOAPIRequestManager.Instance.SendRequest(new MMORequestDeleteUser(tLoginData.PlayerID),(pResult) => { pDelResult?.Invoke(true); }, (pErrorCode) => { pDelResult?.Invoke(false); }); MMODataSyncManager.Instance.gameObject.SetActive(false); } } } public enum MMOTaskType { DailyReward = -1, InviteUsers = -2, Unknown = 0, GetDiamond, PassLevel, WatchRV, DailyLevel, DailyAds, RiseRank, Final }