diff --git a/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js b/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js index 5272b0c0b..3a074269c 100644 --- a/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js +++ b/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js @@ -1767,6 +1767,37 @@ function Make_EqiupmentEnchantOption_perEnchant(urod, id) urod.EnchantOption[id].Option.push({ id: optionid, lv: olv }); } } +handlers.Save_EquipItem_EnchantOption = function(args) +{ + var readonlydata = Get_UserReadOnlyData(); + var error = Get_Error(readonlydata, args.Token); + if (error < 0) return Get_Return(error); + + var urod = Get_JsonUserData(readonlydata); + var enchantdata = args.EnchantData; + var id = enchantdata.EnchantID; + + var slot = urod.Slot.find(f => f.Parts == enchantdata.Parts); + if (slot.Lv < Get_GlobalValue_nValue(`EnchantOpenLv${enchantdata.Slot + 1}`)) + return Get_Return(2); + + var table = Get_MissionTable(); + if (Use_Item(table, urod, id, enchantdata.Count)) + { + var option = urod.EnchantOption[id].Option.at(-1); + slot.Enchant[enchantdata.Slot].ID = option.id; + slot.Enchant[enchantdata.Slot].Lv = option.lv; + + Make_EqiupmentEnchantOption_perEnchant(urod, id); + + Add_MissionCount(table, urod, "EQUIP_ITEM_ENCHANT_ALL", 0, enchantdata.Count); + Add_MissionCount(table, urod, "EQUIP_ITEM_ENCHANT_ACC", 0, enchantdata.Count); + + Set_JsonUserData(urod); + return Get_Return(0, { lastoption: option, newoption : urod.EnchantOption[id] }); + } + return Get_Return(1); +} handlers.Save_EquipItem_Enchant = function(args) { var readonlydata = Get_UserReadOnlyData(); diff --git a/Assets/ResWork/Table/butler.xlsm b/Assets/ResWork/Table/butler.xlsm index ccf3c344a..21fe61697 100644 Binary files a/Assets/ResWork/Table/butler.xlsm and b/Assets/ResWork/Table/butler.xlsm differ diff --git a/Assets/Script/Server/ServerClass.cs b/Assets/Script/Server/ServerClass.cs index ce866b45e..abcdff24d 100644 --- a/Assets/Script/Server/ServerClass.cs +++ b/Assets/Script/Server/ServerClass.cs @@ -3150,6 +3150,11 @@ public class SC_EnchantEquipItemResult { public int optionconfigid, Lv; } +public class SC_EnchantOptionResult +{ + public SD_OptionDetailData lastoption; + public SD_EquipItemEnchant newoption; +} public class SC_PetGachaResult { public int gem; @@ -3215,4 +3220,9 @@ public class CS_AwakenData awaken[eStat.LUK] = 0; } } +public class CS_EquipSlotEnchantData +{ + public eItem Parts; + public int Slot, EnchantID, Count; +} #endregion \ No newline at end of file diff --git a/Assets/Script/Server/ServerInfo.cs b/Assets/Script/Server/ServerInfo.cs index ae035d6bc..01b4d24be 100644 --- a/Assets/Script/Server/ServerInfo.cs +++ b/Assets/Script/Server/ServerInfo.cs @@ -1624,6 +1624,42 @@ public class ServerInfo : MyCoroutine Set_Coroutine(() => { Save_EquipItem_SlotLvUpInit(itemid, _act); }, 2f); }); } + public void Save_EquipItem_EnchantOption(CS_EquipSlotEnchantData data, Action _act) + { + NetWait.Ins.Set(true); + PlayFabClientAPI.ExecuteCloudScript(new ExecuteCloudScriptRequest + { + FunctionName = MethodBase.GetCurrentMethod().Name, + GeneratePlayStreamEvent = true, + FunctionParameter = new + { + Token = m_LoginInfo.EntityToken.EntityToken, + EnchantData = data, + } + }, + result => + { + if (result.Error == null) + { + NetWait.Ins.Set(false); + var str_result = result.FunctionResult.ToString(); + var error = MyErrorCheck(str_result); + // (0 성공, 1 실패 (인챈트 부족), 2 실패 (잠긴 슬롯)) + switch (error) + { + case 0: _act?.Invoke(JsonConvert.DeserializeObject(str_result)); break; + case 1: ToastUI.Ins.Set(388); break; + case 2: ToastUI.Ins.Set(999900012); break; + } + } + else + Set_Coroutine(() => { Save_EquipItem_EnchantOption(data, _act); }, 2f); + }, + fail => + { + Set_Coroutine(() => { Save_EquipItem_EnchantOption(data, _act); }, 2f); + }); + } /// /// itemid : 인챈트 할 착용 아이템 id /// diff --git a/Assets/Script/UI/Eqiupment/EquipmentEnchantCard.cs b/Assets/Script/UI/Eqiupment/EquipmentEnchantCard.cs index 912915ad2..52b6f50d8 100644 --- a/Assets/Script/UI/Eqiupment/EquipmentEnchantCard.cs +++ b/Assets/Script/UI/Eqiupment/EquipmentEnchantCard.cs @@ -1,3 +1,4 @@ +using CodeStage.AntiCheat.ObscuredTypes; using TMPro; using UnityEngine; using UnityEngine.UI; @@ -16,6 +17,9 @@ public class EquipmentEnchantCard : CardBase EnchantListTableData m_Data; EnchantRateTableData m_EnchantRateTableData; + ObscuredInt m_EnchantCount; + CS_EquipSlotEnchantData m_EnchantData = new CS_EquipSlotEnchantData(); + public override void Set(T _base) { base.Set(_base); @@ -24,6 +28,10 @@ public class EquipmentEnchantCard : CardBase Set_UI(); // 착용 장비 DSUtil.InActivateGameObjects(gos, PopupMgr.Ins.m_EquipmentItemPopup.isActiveAndEnabled ? 1 : 0); + m_EnchantCount = 0; + m_EnchantCount.RandomizeCryptoKey(); + m_EnchantData.EnchantID = m_Data.n_EnchantID; + m_EnchantData.Parts = PopupMgr.Ins.m_EquipmentItemPopup.Get_Parts(); } public override void Set_UI() @@ -64,26 +72,41 @@ public class EquipmentEnchantCard : CardBase var sdata = ServerInfo.Ins.m_ServerData; if (sdata.Get_EnchantLv(m_Data.n_EnchantID) > 0 && sdata.Check_ItemAmount(m_Data.n_EnchantID, 1)) { // 마법 부여 하자 + ++m_EnchantCount; m_EnchantCount.RandomizeCryptoKey(); + sdata.Use_Item(m_Data.n_EnchantID, 1); - var parts = PopupMgr.Ins.m_EquipmentItemPopup.Get_Parts(); var enchant = sdata.EnchantOption[m_Data.n_EnchantID]; var option = enchant.Option[enchant.Index++]; - sdata.Set_SlotEnchant(parts, Select_EnchantCardData.Index, option.id, option.lv); - PopupMgr.Ins.m_EquipmentItemPopup.m_EquipItemEnchantOption.Set_UI(); - if(enchant.Option.Count <= enchant.Index) + if (enchant.Option.Count <= enchant.Index) { - enchant.Index = 0; + m_EnchantData.Count = m_EnchantCount; // 현재까지 저장하고 새로운 데이터 받아오기 + m_EnchantData.Slot = Select_EnchantCardData.Index; + ServerInfo.Ins.Save_EquipItem_EnchantOption(m_EnchantData, result => + { + sdata.Add_MissionCount(ePurpose.EQUIP_ITEM_ENCHANT_ACC, 0, m_EnchantCount); + sdata.Add_MissionCount(ePurpose.EQUIP_ITEM_ENCHANT_ALL, 0, m_EnchantCount); + + sdata.Set_SlotEnchant(m_EnchantData.Parts, m_EnchantData.Slot, result.lastoption.id, result.lastoption.lv); + sdata.EnchantOption[m_Data.n_EnchantID] = result.newoption; + + m_EnchantCount = 0; m_EnchantCount.RandomizeCryptoKey(); + RefreshUI(); + }); + } + else + { + sdata.Set_SlotEnchant(m_EnchantData.Parts, m_EnchantData.Slot, option.id, option.lv); + RefreshUI(); } - - // 나중에 서버 저장 후 처리 - //sdata.Add_MissionCount(ePurpose.EQUIP_ITEM_ENCHANT_ACC); - //sdata.Add_MissionCount(ePurpose.EQUIP_ITEM_ENCHANT_ALL); - - Set_UI(); } } + void RefreshUI() + { + PopupMgr.Ins.m_EquipmentItemPopup.m_EquipItemEnchantOption.Set_UI(); + Set_UI(); + } /* 변경마다 서버 탐 public void OnClick_EnchantEquipItem() { diff --git a/Assets/Script/UI/Eqiupment/EquipmentItemPopup.cs b/Assets/Script/UI/Eqiupment/EquipmentItemPopup.cs index 90257081e..22169549a 100644 --- a/Assets/Script/UI/Eqiupment/EquipmentItemPopup.cs +++ b/Assets/Script/UI/Eqiupment/EquipmentItemPopup.cs @@ -59,7 +59,7 @@ public class EquipmentItemPopup : EquipmentPopupItemInfoBase } int Get_Price() { var price = (int)m_ESUTD.Get_Price(m_SD_Slot.Lv); return price > 0 ? price : 1; } - public eItem Get_Parts() { return m_Data.e_EquipParts; } + public eItem Get_Parts() { return DSUtil.CheckNull(m_Data) ? eItem.None : m_Data.e_EquipParts; } public int Get_ItemID() { return m_Data.n_EquipID; } public void OnClick_Reinforce()