diff --git a/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js b/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js index f6bce482b..319a76d77 100644 --- a/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js +++ b/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js @@ -798,44 +798,47 @@ handlers.Save_PC_MenuBack = function(args) var awakenupgradeid = Get_GlobalValue_nValue("AWAKEN_GOODS_UPGRADE"); var awakenUpgradeTable = Get_AwakenUpgradeTable(); var useawakenMatIds = {}; + + var allStatKeys = new Set(); + for (var i = 0; i < awakenData.upgrade.length; ++i) allStatKeys.add(awakenData.upgrade[i].Key); + for (var i = 0; i < awakenData.awaken.length; ++i) allStatKeys.add(awakenData.awaken[i].Key); - for (var i = 0; i < awakenData.upgrade.length; ++i) + for (let statKey of allStatKeys) { - var statKey = awakenData.upgrade[i].Key; - var upgradeValue = parseInt(awakenData.upgrade[i].Value || 0); - var awakenValue = parseInt(awakenData.awaken[i].Value || 0); + var upgradeValue = parseInt((awakenData.upgrade.find(x => x.Key === statKey)?.Value) || 0); + var awakenValue = parseInt((awakenData.awaken.find(x => x.Key === statKey)?.Value) || 0); - if (upgradeValue > 0) - for (var j = 0; j < upgradeValue; ++j) - { - var lv = urod.Awaken[statKey].Lv; - var audata = awakenUpgradeTable.find(f=>f.n_AwakenStep == lv); - - if (urod.Awaken[statKey].Exp >= audata.n_MaxUpgradeLevel && awakenValue > 0) - { // 각성 각성 - var awakenmat = Get_GlobalValue_nValue(Get_PCAwakenMatKey(statKey)); - if (!useawakenMatIds[awakenmat]) useawakenMatIds[awakenmat] = true; - if (Use_Item(table, urod, awakenmat, audata.n_AwakenGoodsCost)) - { - --awakenValue; - urod.Awaken[statKey].Exp = 0; - ++urod.Awaken[statKey].Lv; - --j; - continue; - } - else break; - } - - var price = Get_K_Value(lv, audata.f_BalanceConstant, audata.n_DefaultUpgradeCostValue, audata.f_CountPerUpgradeCostValue); - if (urod.Awaken[statKey].Exp < audata.n_MaxUpgradeLevel && Use_Item(table, urod, awakenupgradeid, price)) - ++urod.Awaken[statKey].Exp; - } - else if (awakenValue > 0) + for (var j = 0; j < upgradeValue; ++j) { var lv = urod.Awaken[statKey].Lv; - var audata = awakenUpgradeTable.find(f=>f.n_AwakenStep == lv); + var audata = awakenUpgradeTable.find(f => f.n_AwakenStep == lv); + + if (urod.Awaken[statKey].Exp >= audata.n_MaxUpgradeLevel && awakenValue > 0) + { + var awakenmat = Get_GlobalValue_nValue(Get_PCAwakenMatKey(statKey)); + if (!useawakenMatIds[awakenmat]) useawakenMatIds[awakenmat] = true; + if (Use_Item(table, urod, awakenmat, audata.n_AwakenGoodsCost)) + { + --awakenValue; + urod.Awaken[statKey].Exp = 0; + ++urod.Awaken[statKey].Lv; + --j; // 다시 반복 + continue; + } + else break; + } + + var price = Get_K_Value(lv, audata.f_BalanceConstant, audata.n_DefaultUpgradeCostValue, audata.f_CountPerUpgradeCostValue); + if (urod.Awaken[statKey].Exp < audata.n_MaxUpgradeLevel && Use_Item(table, urod, awakenupgradeid, price)) + ++urod.Awaken[statKey].Exp; + } + + if (upgradeValue == 0 && awakenValue > 0) + { + var lv = urod.Awaken[statKey].Lv; + var audata = awakenUpgradeTable.find(f => f.n_AwakenStep == lv); if (urod.Awaken[statKey].Exp >= audata.n_MaxUpgradeLevel) - { // 각성 각성 + { var awakenmat = Get_GlobalValue_nValue(Get_PCAwakenMatKey(statKey)); if (!useawakenMatIds[awakenmat]) useawakenMatIds[awakenmat] = true; if (Use_Item(table, urod, awakenmat, audata.n_AwakenGoodsCost)) @@ -868,6 +871,13 @@ handlers.Save_PC_MenuBack = function(args) // 초월 프리셋 urod.Equip.LimitPreset = args.Preset; + // 초월 옵션 + log.info(args.LimitSlotData.Preset); + log.info(urod.LimitBreakOption.Preset); + urod.LimitBreakOption.Preset = args.LimitSlotData.Preset; + log.info(urod.LimitBreakOption.Preset); + Set_LimitSlotOption(table, urod, args); + Set_JsonUserData(urod); return Get_Return(0, { awakekMats : rtn_awakenMatIds, @@ -1181,21 +1191,26 @@ handlers.Save_PC_LimitLvUp = function(args) else return Get_Return(1); // PC 레벨 부족 } +function Set_LimitSlotOption(table, urod, args, makeoption = false) +{ + Use_Item(table, urod, Get_GlobalValue_nValue("n_BreakingLimitSlotMaterialID"), args.LimitSlotData.Price); + urod.LimitSlot = args.LimitSlotData.LimitSlot; + if (makeoption) Make_LimitBreakOption(urod); + + Add_MissionCount(table, urod, "HERO_OPTION_CHANGE", 0, args.LimitSlotData.Count, false); + Add_MissionCount(table, urod, "HERO_OPTION_CHANGE_ACC", 0, args.LimitSlotData.Count, false); +} handlers.Save_PC_LimitSlotOption = function(args) { var readonlydata = Get_UserReadOnlyData(); var error = Get_Error(readonlydata, args.Token); if (error < 0) return Get_Return(error); + if (CheckNullOrEmpty(args.LimitSlotData)) return Get_Return(1); var urod = Get_JsonUserData(readonlydata); var table = Get_MissionTable(); - Use_Item(table, urod, Get_GlobalValue_nValue("n_BreakingLimitSlotMaterialID"), args.UseAmount); - urod.LimitSlot = args.LimitSlot; - Make_LimitBreakOption(urod); - - Add_MissionCount(table, urod, "HERO_OPTION_CHANGE", 0, args.ChangeCount, false); - Add_MissionCount(table, urod, "HERO_OPTION_CHANGE_ACC", 0, args.ChangeCount, false); - + + Set_LimitSlotOption(table, urod, args, true); Set_JsonUserData(urod); return Get_Return(0, { option : urod.LimitBreakOption }); } diff --git a/Assets/Script/Server/ServerInfo.cs b/Assets/Script/Server/ServerInfo.cs index 5e6bb7d0a..9983d14a3 100644 --- a/Assets/Script/Server/ServerInfo.cs +++ b/Assets/Script/Server/ServerInfo.cs @@ -859,7 +859,8 @@ public class ServerInfo : MyCoroutine Set_Coroutine(() => { Save_StageResult(_act); }, 2f); }); } - public void Save_PC_MenuBack(int costumeid, int workerid, int jobid, int preset, CS_AwakenData awakenData, Action _act) + public void Save_PC_MenuBack(int costumeid, int workerid, int jobid, int preset, + CS_AwakenData awakenData, LimitSlotChangeData limitslotData, Action _act) { NetWait.Ins.Set(true); PlayFabClientAPI.ExecuteCloudScript(new ExecuteCloudScriptRequest @@ -873,7 +874,8 @@ public class ServerInfo : MyCoroutine WorkerID = workerid, JobID = jobid, Preset = preset, - AwakenData = awakenData + AwakenData = awakenData, + LimitSlotData = limitslotData } }, result => @@ -893,11 +895,11 @@ public class ServerInfo : MyCoroutine } } else - Set_Coroutine(() => { Save_PC_MenuBack(costumeid, workerid, jobid, preset, awakenData, _act); }, 2f); + Set_Coroutine(() => { Save_PC_MenuBack(costumeid, workerid, jobid, preset, awakenData, limitslotData, _act); }, 2f); }, fail => { - Set_Coroutine(() => { Save_PC_MenuBack(costumeid, workerid, jobid, preset, awakenData, _act); }, 2f); + Set_Coroutine(() => { Save_PC_MenuBack(costumeid, workerid, jobid, preset, awakenData, limitslotData, _act); }, 2f); }); } @@ -1128,10 +1130,10 @@ public class ServerInfo : MyCoroutine Set_Coroutine(() => { Save_PC_LimitLvUp(_act); }, 2f); }); } - public void Save_PC_LimitSlotOption(int useAmount, int change, Action _act) + public void Save_PC_LimitSlotOption(LimitSlotChangeData limitslotData, Action _act) { NetWait.Ins.Set(true); - var serverread = m_ServerData.Get_ServerRead(); + var lsd = limitslotData.Get(); PlayFabClientAPI.ExecuteCloudScript(new ExecuteCloudScriptRequest { FunctionName = MethodBase.GetCurrentMethod().Name, @@ -1139,9 +1141,7 @@ public class ServerInfo : MyCoroutine FunctionParameter = new { Token = m_LoginInfo.EntityToken.EntityToken, - UseAmount = useAmount, - ChangeCount = change, - LimitSlot = serverread.LimitSlot + LimitSlotData = lsd } }, result => @@ -1158,14 +1158,17 @@ public class ServerInfo : MyCoroutine _act(); } else - Set_Coroutine(() => { Save_PC_LimitSlotOption(useAmount, change, _act); }, 2f); + { + ToastUI.Ins.Set(174, "데이터 없음"); + Set_Coroutine(() => { Save_PC_LimitSlotOption(limitslotData, _act); }, 5f); + } } else - Set_Coroutine(() => { Save_PC_LimitSlotOption(useAmount, change, _act); }, 2f); + Set_Coroutine(() => { Save_PC_LimitSlotOption(limitslotData, _act); }, 2f); }, fail => { - Set_Coroutine(() => { Save_PC_LimitSlotOption(useAmount, change, _act); }, 2f); + Set_Coroutine(() => { Save_PC_LimitSlotOption(limitslotData, _act); }, 2f); }); } public void Save_PC_LimitSlotOptionChange(string preset, Action _act) diff --git a/Assets/Script/UI/PC/Limit/PCLimitSlotCard.cs b/Assets/Script/UI/PC/Limit/PCLimitSlotCard.cs index de73a20cd..bdeb92266 100644 --- a/Assets/Script/UI/PC/Limit/PCLimitSlotCard.cs +++ b/Assets/Script/UI/PC/Limit/PCLimitSlotCard.cs @@ -88,20 +88,21 @@ public class PCLimitSlotCard : CardBase public void Set_Change(string preset, int ipreset) { var sdata = ServerInfo.Ins.m_ServerData; + var optionindex = ipreset + 1; + var presetindex = ipreset; if (!isCloseSlot() && !sdata.isLock_LimitSlot(preset, m_Slot)) { - var option = sdata.LimitBreakOption.Option[ipreset][sdata.LimitBreakOption.Preset[ipreset]++]; - if (sdata.LimitBreakOption.Preset[ipreset] >= sdata.LimitBreakOption.Option[ipreset].Count) + var option = sdata.LimitBreakOption.Option[optionindex][sdata.LimitBreakOption.Preset[presetindex]++]; + if (sdata.LimitBreakOption.Preset[presetindex] >= sdata.LimitBreakOption.Option[optionindex].Count) { - sdata.LimitBreakOption.Preset[ipreset] = 0; + sdata.LimitBreakOption.Preset[presetindex] = 0; // 다음 테이블 서버에서 받아오기 PCLimitUI.Ins.m_PCLimitUI_Right.ChangeOption = true; } sdata.Set_LimitSlotID(preset, m_Slot, option.id, option.lv); sdata.Add_MissionCount(ePurpose.HERO_OPTION_CHANGE); sdata.Add_MissionCount(ePurpose.HERO_OPTION_CHANGE_ACC); - ++PCLimitUI.Ins.m_PCLimitUI_Right.MissionCount; - PCLimitUI.Ins.m_PCLimitUI_Right.MissionCount.RandomizeCryptoKey(); + PCLimitUI.Ins.m_PCLimitUI_Right.m_LimitSlotChangeData.Add_MissionCount(); } } @@ -113,11 +114,11 @@ public class PCLimitSlotCard : CardBase var preset = PCLimitUI.Ins.m_PCLimitUI_Right.Get_Preset(); if (m_SData.ID > 0 || sdata.isLock_LimitSlot(preset, m_Slot)) { - ServerInfo.Ins.Save_PC_LimitSlotLock(preset, m_Slot, () => - { + //ServerInfo.Ins.Save_PC_LimitSlotLock(preset, m_Slot, () => + //{ sdata.Set_LimitSlotLock(preset, m_Slot); PCLimitUI.Ins.m_PCLimitUI_Right.Set(); - }); + //}); } } } \ No newline at end of file diff --git a/Assets/Script/UI/PC/Limit/PCLimitUI.cs b/Assets/Script/UI/PC/Limit/PCLimitUI.cs index 85f90f7b7..35937c4ce 100644 --- a/Assets/Script/UI/PC/Limit/PCLimitUI.cs +++ b/Assets/Script/UI/PC/Limit/PCLimitUI.cs @@ -1,10 +1,8 @@ public class PCLimitUI : PCUIMenu { + public static bool isIns; public static PCLimitUI Ins; - private void Awake() - { - Ins = this; - } + private void Awake() { isIns = true; Ins = this; } public PCLimit_Center m_PCLimit_Center; public PCLimitUI_Right m_PCLimitUI_Right; @@ -16,6 +14,7 @@ public class PCLimitUI : PCUIMenu m_PCLimit_Center.Set(); m_PCLimitUI_Right.Set(); + m_PCLimitUI_Right.m_LimitSlotChangeData.Init(true); if (NewGameUI.Ins.m_PCUI.Get_EnterID(eItem.Preset) == 0) NewGameUI.Ins.m_PCUI.Set_EnterID(eItem.Preset, ServerInfo.Ins.m_ServerData.Equip.LimitPreset); } diff --git a/Assets/Script/UI/PC/Limit/PCLimitUI_Right.cs b/Assets/Script/UI/PC/Limit/PCLimitUI_Right.cs index 27f1ac861..30b3924d5 100644 --- a/Assets/Script/UI/PC/Limit/PCLimitUI_Right.cs +++ b/Assets/Script/UI/PC/Limit/PCLimitUI_Right.cs @@ -3,6 +3,45 @@ using System.Collections.Generic; using TMPro; using UnityEngine; +public class LimitSlotChangeData +{ + ObscuredInt TotalPrice, MissionCount; + + // 아래는 서버에 전송할 데이터 + public List Preset; + public Dictionary> LimitSlot = new Dictionary>(); + public int Price, Count; + + public void Init(bool copydata) + { + TotalPrice = 0; TotalPrice.RandomizeCryptoKey(); + MissionCount = 0; MissionCount.RandomizeCryptoKey(); + } + void Copy_ServerLimitSlot() + { + LimitSlot.Clear(); + var slotdata = ServerInfo.Ins.m_ServerData.LimitSlot; + foreach (var pair in slotdata) + { + var copiedList = new List(); + foreach (var data in pair.Value) + copiedList.Add(data.Get()); + LimitSlot[pair.Key] = copiedList; + } + } + public LimitSlotChangeData Get() + { + Price = TotalPrice; + Count = MissionCount; + Preset = ServerInfo.Ins.m_ServerData.LimitBreakOption.Preset; + Copy_ServerLimitSlot(); + return this; + } + + public bool IsChangeLimitSlot() { return TotalPrice > 0; } + public void Add_TotalPrice(int price) { TotalPrice += price; TotalPrice.RandomizeCryptoKey(); } + public void Add_MissionCount() { ++MissionCount; MissionCount.RandomizeCryptoKey(); } +} public class PCLimitUI_Right : uScrollViewMgr { public TabUIBase m_Tab; @@ -11,7 +50,7 @@ public class PCLimitUI_Right : uScrollViewMgr public ButtonPress Btn_Change; public bool ChangeOption; - public ObscuredInt TotalPrice, MissionCount; + public LimitSlotChangeData m_LimitSlotChangeData = new LimitSlotChangeData(); string m_Preset = "1"; int m_matID, m_CurProtectGrade, m_ProtectMaxGrade; ObscuredInt mPrice; @@ -131,23 +170,23 @@ public class PCLimitUI_Right : uScrollViewMgr { var sdata = ServerInfo.Ins.m_ServerData; sdata.Use_Item(m_matID, mPrice); - list_CardBase.ForEach(f => (f as PCLimitSlotCard).Set_Change(m_Preset, m_Tab.Get_Index() + 1)); + list_CardBase.ForEach(f => (f as PCLimitSlotCard).Set_Change(m_Preset, m_Tab.Get_Index())); Set(); MyValue.Get_ActorStatInfoorNull(eRole.PC); NewGameUI.Ins.m_PCUI.Refresh_Money(); - TotalPrice += mPrice; TotalPrice.RandomizeCryptoKey(); + var changeData = PCLimitUI.Ins.m_PCLimitUI_Right.m_LimitSlotChangeData; + changeData.Add_TotalPrice(mPrice); if (ChangeOption) { Btn_Change.ControlPress(false); - ServerInfo.Ins.Save_PC_LimitSlotOption(TotalPrice, MissionCount, + ServerInfo.Ins.Save_PC_LimitSlotOption(changeData, () => { ChangeOption = false; Btn_Change.ControlPress(true); - TotalPrice = 0; TotalPrice.RandomizeCryptoKey(); - MissionCount = 0; MissionCount.RandomizeCryptoKey(); + changeData.Init(false); }); } diff --git a/Assets/Script/UI/PC/PCUI.cs b/Assets/Script/UI/PC/PCUI.cs index b4d925d23..629dbdee5 100644 --- a/Assets/Script/UI/PC/PCUI.cs +++ b/Assets/Script/UI/PC/PCUI.cs @@ -50,14 +50,16 @@ public class PCUI : BotMenuBase bool changejob = Get_EnterID(eItem.PC) > 0 && Get_EnterID(eItem.PC) != sdata.Get_EqiupmentEquip(eItem.PC); bool changepreset = Get_EnterID(eItem.Preset) > 0 && Get_EnterID(eItem.Preset) != sdata.Equip.LimitPreset; bool pcawakend = PCAwakenUI.isIns && PCAwakenUI.Ins.IsSendAwakenData(); + bool changelimitslot = PCLimitUI.isIns && PCLimitUI.Ins.m_PCLimitUI_Right.m_LimitSlotChangeData.IsChangeLimitSlot(); - if (changeCostume || changeworker || changejob || changepreset || pcawakend) + if (changeCostume || changeworker || changejob || changepreset || pcawakend || changelimitslot) { ServerInfo.Ins.Save_PC_MenuBack(sdata.Get_EqiupmentEquip(eItem.PCCostume), sdata.Get_EqiupmentEquip(eItem.Worker), sdata.Get_EqiupmentEquip(eItem.PC), sdata.Equip.LimitPreset, PCAwakenUI.isIns ? PCAwakenUI.Ins.Get_CS_AwakenData() : emptyawaken, + PCLimitUI.Ins.m_PCLimitUI_Right.m_LimitSlotChangeData.Get(), result => { for (int i = 0; i < result.awakekMats.Count; i++)