using CodeStage.AntiCheat.ObscuredTypes; using System.Collections.Generic; using TMPro; using UnityEngine; public class LimitSlotChangeData { ObscuredInt TotalPrice, MissionCount; // 아래는 서버에 전송할 데이터 public List Preset; public Dictionary> LimitSlot = new Dictionary>(); public int SelectPreset, Price, Count; public void Init() { var sdata = ServerInfo.Ins.m_ServerData; TotalPrice = 0; TotalPrice.RandomizeCryptoKey(); MissionCount = 0; MissionCount.RandomizeCryptoKey(); SelectPreset = sdata.Equip.LimitPreset; Copy_ServerLimitSlot(); } 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() { var sdata = ServerInfo.Ins.m_ServerData; Price = TotalPrice; Count = MissionCount; SelectPreset = sdata.Equip.LimitPreset; Preset = sdata.LimitBreakOption != null ? sdata.LimitBreakOption.Preset : null; Copy_ServerLimitSlot(); return this; } public bool IsChangeLimitSlot() { if (TotalPrice > 0) return true; var sdata = ServerInfo.Ins.m_ServerData; if (SelectPreset != sdata.Equip.LimitPreset) return true; var currentSlotData = ServerInfo.Ins.m_ServerData.LimitSlot; foreach (var pair in currentSlotData) { if (!LimitSlot.TryGetValue(pair.Key, out var beforeList)) return true; var currentList = pair.Value; if (beforeList.Count != currentList.Count) return true; for (int i = 0; i < currentList.Count; i++) { var before = beforeList[i]; var current = currentList[i]; if (before.ID != current.ID || before.Lv != current.Lv || before.Lock != current.Lock) return true; } } return false; } public void Add_TotalPrice(int price) { TotalPrice += price; TotalPrice.RandomizeCryptoKey(); } public void Add_MissionCount() { ++MissionCount; MissionCount.RandomizeCryptoKey(); } public int Get_MissionCount() { return MissionCount; } } public class PCLimitUI_Right : uScrollViewMgr { public TabUIBase m_Tab; public MoneyForm m_Price; public TextMeshProUGUI[] texts; // 0 보호 등급 public ButtonPress Btn_Change; public bool ChangeOption; public LimitSlotChangeData m_LimitSlotChangeData = new LimitSlotChangeData(); string m_Preset = "1"; int m_matID, m_CurProtectGrade, m_ProtectMaxGrade; ObscuredInt mPrice; List list_TabData = new List { new TabUIData{ btnName = "1" }, new TabUIData{ btnName = "2" }, new TabUIData{ btnName = "3" } }; public override void Set() { m_matID = table_GlobalValue.Ins.Get_Int("n_BreakingLimitSlotMaterialID"); m_Preset = ServerInfo.Ins.m_ServerData.Equip.LimitPreset.ToString(); m_Tab.Set_Index(ServerInfo.Ins.m_ServerData.Equip.LimitPreset - 1); for (int i = 0; i < list_TabData.Count; i++) { list_TabData[i].onClick = OnClick_Preset; } m_Tab.Set(list_TabData); OnClick_Preset(); } public override void Set_UI() { var sdata = ServerInfo.Ins.m_ServerData; Set_ScrollView(sdata.Get_LimitSlot(m_Preset)); for (int i = 0; i < list_CardBase.Count; i++) list_CardBase[i].Set(i + 1); mPrice = Get_Price(); mPrice.RandomizeCryptoKey(); m_Price.amount.text = NumberFormatter.FormatNumber(mPrice); var lv = Mathf.Max(1, sdata.Get_LimitLv()); if (lv > 9) lv = 0; var Tdata = table_limitslotmagicrate.Ins.Get_Data_orNull(lv); m_ProtectMaxGrade = Tdata.MaxGrade; if (m_CurProtectGrade == 0) m_CurProtectGrade = m_ProtectMaxGrade; Set_ProtectUI(); } void Set_ProtectUI() { texts[0].text = m_CurProtectGrade.ToString(); } int Get_Price() { int LockCount = 0; var sdata = ServerInfo.Ins.m_ServerData; var lst = sdata.Get_LimitSlot(m_Preset); for (int i = 0; i < lst.Count; i++) { if (lst[i].Lock == 1) ++LockCount; } int baseValue = 10; return baseValue * ((1 + LockCount) * LockCount / 2 + 1); } bool IsOpenSlot() { // 열린 슬롯이 있어야 한다. var sdata = ServerInfo.Ins.m_ServerData; var lst = sdata.Get_LimitSlot(m_Preset); for (int i = 0; i < lst.Count; i++) { var isOpen = table_breakinglimit.Ins.Get_SlotOpenLv(i + 1) <= sdata.Get_LimitLv(); if (isOpen && lst[i].Lock == 0) return true; } return false; } bool CheckMoney(bool showtoast) { return ServerInfo.Ins.m_ServerData.Check_ItemAmount(m_matID, mPrice, showtoast); } public string Get_Preset() { return m_Preset; } public void OnClick_Preset() { m_Preset = (m_Tab.Get_Index() + 1).ToString(); var sdata = ServerInfo.Ins.m_ServerData; sdata.Equip.LimitPreset = int.Parse(m_Preset); sdata.Equip.LimitPreset.RandomizeCryptoKey(); Set_UI(); } public void OnClick_ProtectGrade(int grade) { m_CurProtectGrade += grade; if (m_CurProtectGrade < 1) m_CurProtectGrade = m_ProtectMaxGrade; else if (m_CurProtectGrade > m_ProtectMaxGrade) m_CurProtectGrade = 1; Set_ProtectUI(); } public void OnClick_Change() { if (!ChangeOption && IsOpenSlot() && CheckMoney(true)) { var sdata = ServerInfo.Ins.m_ServerData; var lst = sdata.Get_LimitSlot(m_Preset); for (int i = 0; i < lst.Count; i++) { if (lst[i].Lock == 0 && lst[i].ID > 0) { var Tdata = table_enchantgradeconfig.Ins.Get_Data_bylv(lst[i].Lv); if (Tdata.n_EnchantGrade >= m_CurProtectGrade) { Popup.Ins.Set(ePopupType.One, 265, Change); return; } } } Change(); } } void Change() { 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())); Set(); MyValue.Get_ActorStatInfoorNull(eRole.PC); NewGameUI.Ins.m_PCUI.Refresh_Money(); var changeData = PCLimitUI.Ins.m_PCLimitUI_Right.m_LimitSlotChangeData; changeData.Add_TotalPrice(mPrice); if (ChangeOption) { Btn_Change.ControlPress(false); ServerInfo.Ins.Save_PC_LimitSlotOption(changeData, result => { ChangeOption = false; Btn_Change.ControlPress(true); if (result.limitslot.success) { sdata.LimitBreakOption = result.option; sdata.Add_MissionCount(ePurpose.HERO_OPTION_CHANGE, 0, changeData.Get_MissionCount()); sdata.Add_MissionCount(ePurpose.HERO_OPTION_CHANGE_ACC, 0, changeData.Get_MissionCount()); } else { sdata.LimitBreakOption.Preset = result.limitslot.limitpreset; foreach (var item in result.limitslot.limitslotoption) { sdata.LimitSlot[item.Key].Clear(); for (int i = 0; i < item.Value.Count; i++) sdata.LimitSlot[item.Key].Add(item.Value[i].Get()); } MyValue.Get_ActorStatInfoorNull(eRole.PC); sdata.Set_Item(result.limitslot.matID, result.limitslot.curAmount); NewGameUI.Ins.m_PCUI.Refresh_Money(); Set_UI(); } changeData.Init(); }); } //ServerInfo.Ins.Save_PC_LimitSlotOptionChange(m_Preset, options => //{ // var sdata = ServerInfo.Ins.m_ServerData; // sdata.Use_Item(m_matID, mPrice); // list_CardBase.ForEach(f => (f as PCLimitSlotCard).Set_Change(m_Preset, options)); // Set(); // MyValue.Get_ActorStatInfoorNull(eRole.PC); // NewGameUI.Ins.m_PCUI.Refresh_Money(); //}); } }