256 lines
8.7 KiB
C#
256 lines
8.7 KiB
C#
using CodeStage.AntiCheat.ObscuredTypes;
|
|
using System.Collections.Generic;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
|
|
public class LimitSlotChangeData
|
|
{
|
|
ObscuredInt TotalPrice, MissionCount;
|
|
|
|
// 아래는 서버에 전송할 데이터
|
|
public List<int> Preset;
|
|
public Dictionary<string, List<SD_PCLimitSlotData_Read>> LimitSlot = new Dictionary<string, List<SD_PCLimitSlotData_Read>>();
|
|
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<SD_PCLimitSlotData_Read>();
|
|
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<TabUIData> list_TabData = new List<TabUIData>
|
|
{ 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();
|
|
//});
|
|
}
|
|
} |