diff --git a/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js b/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js index 89635c017..c1faa215c 100644 --- a/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js +++ b/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js @@ -954,7 +954,7 @@ handlers.Save_PC_LimitSlotOptionChange = function(args) var grade = Get_RandomGachaGrade(lv); //log.info("등급 : " + grade); // 랜덤백에서 아이템 id 얻기 - var optionitemID = Get_RandomItemId(lsmc_data.n_DropIndex, grade); + var optionitemID = Get_RandomItem(lsmc_data.n_DropIndex, grade).itemid; //log.info("랜덤백 ID : " + optionitemID); // 인챈트그레이드에서 옵션 레벨 얻기 var olv = Get_OptionLv(grade); @@ -1455,7 +1455,7 @@ handlers.Save_Pet_Gacha = function(args) var petlist = []; for (let i = 0; i < amount; i++) { - var petid = Get_RandomItemId(9000001, urod.PetData.GachaLv); + var petid = Get_RandomItem(9000001, urod.PetData.GachaLv).itemid; petlist.push(petid); Add_Item(table, itemtable, urod, petid, 1); } @@ -1525,6 +1525,45 @@ handlers.Save_Pet_Equip = function(args) Set_JsonUserData(urod); return Get_Return(0); } + +handlers.Save_Essence_Change = 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 table = Get_MissionTable(); + if (Use_Item(table, urod, args.EssenceID, args.Amount)) + { + var itemtable = Get_ItemTable(); + var rewards = []; + var randombagid = Get_GlobalValue_nValue("n_EssenceRandomBagID"); + var mileageid = Get_GlobalValue_nValue("n_EssenceMileageID"); + var mileagevalue = itemtable.find(f=>f.n_ItemID == args.EssenceID).n_ItemValue; + for (var i = 0; i < args.Amount; i++) + { + var grade = Get_EssenceRateGrade(args.EssenceID); + var item = Get_RandomItem(randombagid, grade); + Add_Item(table, itemtable, urod, item.itemid, item.amount); + Add_Item(table, itemtable, urod, mileageid, mileagevalue); // 마일리지 축적 + + var temp = rewards.find(f=>f.itemid == item.itemid); + if (!temp) + rewards.push({ itemid: item.itemid, amount: item.amount }); + else + temp.amount = Add_Amount(temp.amount, item.amount); + } + + Add_MissionCount(table, urod, "ESSENCE_EXCHANGE", 0, args.Amount); + Add_MissionCount(table, urod, "ESSENCE_EXCHANGE_ACC", 0, args.Amount); + + Set_JsonUserData(urod); + return Get_Return(0, { mileage : mileagevalue * args.Amount, items : rewards }); + } + return Get_Return(1); +} /////////////////////////////////// 서버 처리 handlers.Write_UnityInApp = function(args) @@ -13457,7 +13496,7 @@ function Get_RandomBagTable() } ] } -function Get_RandomItemId(dropIndex, grade) { +function Get_RandomItem(dropIndex, grade) { var randombaTable = Get_RandomBagTable(); const items = randombaTable.filter(f => f.n_DropIndex == dropIndex && f.n_ItemGrade == grade @@ -13472,7 +13511,7 @@ function Get_RandomItemId(dropIndex, grade) { let rand = Math.random() * total; for (let i = 0; i < items.length; i++) { if (rand < weights[i]) { - return items[i].n_ItemId; + return { itemid :items[i].n_ItemId, amount : items[i].n_DropCount }; } rand -= weights[i]; } @@ -18506,6 +18545,95 @@ function Get_OptionConfigTable() ] } +function Get_EssenceTable() +{ + return [ + { + "n_EssenceID": "2000001", + "f_Rate1": "0.48", + "f_Rate2": "0.37", + "f_Rate3": "0.12", + "f_Rate4": "0.03", + "f_Rate5": "0", + "f_Rate6": "0" + }, + { + "n_EssenceID": "2000002", + "f_Rate1": "0.3", + "f_Rate2": "0.34", + "f_Rate3": "0.25", + "f_Rate4": "0.1", + "f_Rate5": "0.01", + "f_Rate6": "0" + }, + { + "n_EssenceID": "2000003", + "f_Rate1": "0", + "f_Rate2": "0.3", + "f_Rate3": "0.45", + "f_Rate4": "0.2", + "f_Rate5": "0.05", + "f_Rate6": "0" + }, + { + "n_EssenceID": "2000004", + "f_Rate1": "0", + "f_Rate2": "0.15", + "f_Rate3": "0.22", + "f_Rate4": "0.45", + "f_Rate5": "0.15", + "f_Rate6": "0.03" + }, + { + "n_EssenceID": "2000005", + "f_Rate1": "0", + "f_Rate2": "0", + "f_Rate3": "0.1", + "f_Rate4": "0.15", + "f_Rate5": "0.55", + "f_Rate6": "0.2" + }, + { + "n_EssenceID": "2000006", + "f_Rate1": "0", + "f_Rate2": "0", + "f_Rate3": "0", + "f_Rate4": "0.05", + "f_Rate5": "0.35", + "f_Rate6": "0.6" + } + ] +} +function Get_EssenceRateGrade(id) +{ + const table = Get_EssenceTable(); + const data = table.find(f => f.n_EssenceID == id); + if (!data) return -1; + + // 유효한 등급(rate > 0)만 뽑기 + const rates = []; + for (let i = 1; i <= 6; i++) { + const key = `f_Rate${i}`; + const rate = parseFloat(data[key]); + if (rate > 0) { + rates.push({ grade: i, weight: rate }); + } + } + + // 총합 + const totalWeight = rates.reduce((sum, r) => sum + r.weight, 0); + if (totalWeight <= 0) return -1; + + // 랜덤 추첨 + let rand = Math.random() * totalWeight; + for (let i = 0; i < rates.length; i++) { + if (rand < rates[i].weight) return rates[i].grade; + rand -= rates[i].weight; + } + + return -1; +} + function Get_PlayOCoupons() { var poc = JSON.parse(server.GetTitleInternalData("PlayO").Data.PlayO); diff --git a/Assets/Script/Server/ServerClass.cs b/Assets/Script/Server/ServerClass.cs index cadd4fd2d..a8f2f8588 100644 --- a/Assets/Script/Server/ServerClass.cs +++ b/Assets/Script/Server/ServerClass.cs @@ -2959,6 +2959,11 @@ public class SD_FarmSlot_Read #endregion #region 서버 응답 클래스 +public class SC_Items +{ + public int itemid, amount; +} + public class SC_PCStatInit { public int gem; @@ -2985,4 +2990,9 @@ public class SC_PetLvUpResult { public int usemat, usepet; } +public class SC_EssenceExchangeResult +{ + public int mileage; + public List items; +} #endregion \ No newline at end of file diff --git a/Assets/Script/Server/ServerInfo.cs b/Assets/Script/Server/ServerInfo.cs index 024376dd3..1af7a63ac 100644 --- a/Assets/Script/Server/ServerInfo.cs +++ b/Assets/Script/Server/ServerInfo.cs @@ -1825,6 +1825,43 @@ public class ServerInfo : MyCoroutine Set_Coroutine(() => { Save_Pet_Equip(petid, _act); }, 2f); }); } + + public void Save_Essence_Change(int essenceID, int amount, Action _act) + { + NetWait.Ins.Set(true); + PlayFabClientAPI.ExecuteCloudScript(new ExecuteCloudScriptRequest + { + FunctionName = MethodBase.GetCurrentMethod().Name, + GeneratePlayStreamEvent = true, + FunctionParameter = new + { + Token = m_LoginInfo.EntityToken.EntityToken, + EssenceID = essenceID, + Amount = amount, + } + }, + result => + { + if (result.Error == null) + { + NetWait.Ins.Set(false); + var str_result = result.FunctionResult.ToString(); + var error = MyErrorCheck(str_result); + // (0 성공, 1 실패 (정수 갯수 부족)) + switch (error) + { + case 0: _act?.Invoke(JsonConvert.DeserializeObject(str_result)); break; + case 1: ToastUI.Ins.Set(388); break; + } + } + else + Set_Coroutine(() => { Save_Essence_Change(essenceID, amount, _act); }, 2f); + }, + fail => + { + Set_Coroutine(() => { Save_Essence_Change(essenceID, amount, _act); }, 2f); + }); + } #endregion #region 우편 diff --git a/Assets/Script/UI/Collection/Essence/CollectionEssenceUI_Right.cs b/Assets/Script/UI/Collection/Essence/CollectionEssenceUI_Right.cs index 02e6efe85..bf00cc7e6 100644 --- a/Assets/Script/UI/Collection/Essence/CollectionEssenceUI_Right.cs +++ b/Assets/Script/UI/Collection/Essence/CollectionEssenceUI_Right.cs @@ -61,24 +61,28 @@ public class CollectionEssenceUI_Right : uScrollViewMgr var Tdata = Get_SelectTData(); if (sdata.Check_ItemAmount(Tdata.n_EssenceID, m_UseAmount)) { - sdata.Add_MissionCount(ePurpose.ESSENCE_EXCHANGE, 0, m_UseAmount); - sdata.Add_MissionCount(ePurpose.ESSENCE_EXCHANGE_ACC, 0, m_UseAmount); - sdata.Use_Item(Tdata.n_EssenceID, m_UseAmount); - List list_reward = new List(); - var randombagid = table_GlobalValue.Ins.Get_Int("n_EssenceRandomBagID"); - var mileageid = table_GlobalValue.Ins.Get_Int("n_EssenceMileageID"); - for (int i = 0; i < m_UseAmount; i++) + ServerInfo.Ins.Save_Essence_Change(Tdata.n_EssenceID, m_UseAmount, result => { - var grade = DSUtil.Get_RandomIndex(Tdata.list_rate) + 1; - var item = table_randombag.Ins.Get_RandomItemData(randombagid, grade); - list_reward.Add(new ItemSimpleData { itemid = item.itemid, amount = item.amount }); - sdata.Add_Item(item.itemid, item.amount); - sdata.Add_Item(mileageid, table_itemlist.Ins.Get_Data(Tdata.n_EssenceID).n_ItemValue); // 마일리지 축적 - } - ObtainItemUI.Ins.Set(list_reward); - m_SelectCard.Set_UI(); - Set_UI(); - CollectionEssenceUI_Left.Ins.Set(); + sdata.Use_Item(Tdata.n_EssenceID, m_UseAmount); + + var mileageid = table_GlobalValue.Ins.Get_Int("n_EssenceMileageID"); + List list_reward = new List(); + list_reward.Add(new ItemSimpleData { itemid = mileageid, amount = result.mileage }); + for (int i = 0; i < result.items.Count; i++) + { + sdata.Add_Item(result.items[i].itemid, result.items[i].amount); + list_reward.Add(new ItemSimpleData { itemid = result.items[i].itemid, amount = result.items[i].amount }); + } + sdata.Add_Item(mileageid, result.mileage); + + sdata.Add_MissionCount(ePurpose.ESSENCE_EXCHANGE, 0, m_UseAmount); + sdata.Add_MissionCount(ePurpose.ESSENCE_EXCHANGE_ACC, 0, m_UseAmount); + + ObtainItemUI.Ins.Set(list_reward); + m_SelectCard.Set_UI(); + Set_UI(); + CollectionEssenceUI_Left.Ins.Set(); + }); } } } \ No newline at end of file