NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/UI_VehicleSkinController.cs

442 lines
12 KiB
C#

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Button = UnityEngine.UI.Button;
using Image = UnityEngine.UI.Image;
using PhxhSDK;
using Framework;
using Cysharp.Threading.Tasks;
using cfg.VihecleCultivateCfg;
using System;
using Gameplay;
using Gameplay.Net;
using Gameplay.Common;
using System.Linq;
public class UI_VehicleSkinController : UIWindow
{
public enum SkinStatus
{
Equiped,
Unlocked,
Locked
}
#region UI
//UI GameObj
///Auto Gen Start///
//public Button Button_Back;
public Button Button_back;
public TMP_Text Text_Back;
public Button Button_Home;
public Image Image_DarkLeft;
public Image Image_DarkLeftTop;
public Image Image_DarkTop;
public Image Image_DarkBottom;
public Image Image_OrganizatioFlag;
public Image Image_AngularShape0;
public TMP_Text Text_VehicleType;
public Image Image_AngularShape1;
public TMP_Text Text_Level;
public Image Image_AngularShape2;
public TMP_Text Text_Organization;
public TMP_Text Text_VehicleName;
public Button Button_Part0;
//public Image Image_LightBar0;
public Button Button_Part1;
//public Image Image_LightBar1;
public Button Button_Part2;
//public Image Image_LightBar2;
public Image Image_LineLeft;
public Image Image_LineBottom;
public TMP_Text Text_Title;
public TMP_Text Text_PartName;
public TMP_Text Text_Count;
public ScrollRect ScrollRect_VehicleSkin;
public Image Image_Bg;
public Image Image_SelectedBorder;
public Image Image_Icon;
public TMP_Text Text_Name;
public Image Image_DrakHide;
public Image Image_Locked;
public Image Image_CurrentEquipment;
public Button Button_Equipment;
///Auto Gen End///
#endregion
private RecycleView SkinScrollView;
private long VehicleID = -1;
private PaintType curType = PaintType.None;
private PaintType CurType
{
get { return curType; }
set
{
curType = value;
Text_PartName.text = "PartName_" + CurType.ToString();
SetCurSelectSkin(VehiclePaintDic[curType][0].PaintID);
}
}
private List<TypeToggle> toggles = new();
private List<int> curEquipSkinIDs = new();
private int curSelectSkinID = -1;
//private List<DataVehiclePaint> VehiclePaints = new List<DataVehiclePaint>();
private Dictionary<PaintType, List<DataVehiclePaint>> VehiclePaintDic = new();
private Dictionary<int, SkinItem> recycleItem = new();
public async static UniTask<UIWindow> Open(object data = null)
{
//CameraManager.Instance.SetMainCameraActive(true);
return await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_VehicleSkin, data);
}
// deal with input data
public override void PreLoad(object data = null)
{
VehicleID = (long)data;
DebugUtil.Log("VehicleID : " + VehicleID);
}
// Use this for initialization
public override void OnInit()
{
//bind UI GameObj
UI_VehicleSkinBinder.GetComponents(this);
SkinScrollView = ScrollRect_VehicleSkin.GetComponent<RecycleView>();
SkinScrollView.Init(OnRefreshItem);
BindButton(Button_back, OnBack_Click);
BindButton(Button_Equipment, OnEquipButtonClick);
var currencyList = GetComponent<UI_CurrencyList>("UI_CurrencyList");
currencyList.SetData(GLConfig.Inst.data.DiamondItemId, GLConfig.Inst.data.GoldItemId);
var name = VehicleDataHelper.GetVehicleLocalizeName((int)VehicleID);
Text_VehicleName.text = name;
var curShownVehicleData = VehicleCultivateDataManager.Instance.GetVehicleCultivateDataPro((uint)VehicleID);
Text_Level.text = "Level" + curShownVehicleData.Cfg.VehicleLevel;
Text_Organization.text = VehicleDataHelper.GetVehicleOrganization((int)VehicleID);
VehiclePaint cfg = TableManager.Instance.Tables.VehiclePaint;
foreach (var item in cfg.DataList)
{
if (item.HostVehicle == VehicleID)
{
var paintType = item.PaintType;
if (!VehiclePaintDic.ContainsKey(paintType))
{
VehiclePaintDic.Add(paintType, new List<DataVehiclePaint>());
}
VehiclePaintDic[paintType].Add(item);
}
}
var Vehiclecfg = Actor.Instance.Character.GetVehicleDevelopment(VehicleID);//.paint_set;
if (Vehiclecfg != null)
{
var paintSet = Vehiclecfg.paint_set;
foreach(var paint in paintSet)
{
curEquipSkinIDs.Add((int)paint);
}
}
else
{
DebugUtil.LogError("VehicleID = " + VehicleID + " 未找到涂装配置");
}
CurType = PaintType.Entirety;
toggles = new List<TypeToggle>() {
new TypeToggle(Button_Part0.gameObject, PaintType.Entirety, OnTypeToggleClick),
new TypeToggle(Button_Part1.gameObject, PaintType.Fort, OnTypeToggleClick),
new TypeToggle(Button_Part2.gameObject, PaintType.CaterpillarBelt, OnTypeToggleClick)
};
foreach (var toggle in toggles)
{
toggle.ResetLightBar(CurType);
}
EventManager.Instance.Register<uint>(EventManager.EventName.ItemChange, OnItemChange);
EventManager.Instance.Register(EventManager.EventName.CharacterInfoRefresh, OnDataRefresh);
}
//invoke when open window
protected override void OnShowWindow(object data = null)
{
SkinScrollView.ShowList(VehiclePaintDic[CurType].Count);
var currencyList = GetComponent<UI_CurrencyList>("UI_CurrencyList");
currencyList.Refresh();
}
//invoke when reload window
protected override void OnReloadWindow(object data = null)
{
}
//invoke when close window
protected override void OnHideWindow()
{
}
//invoke when destroy
public override void OnRelease()
{
base.OnRelease();
EventManager.Instance.Send(EventManager.EventName.EN_UIControllCultivateMainInput, true);
EventManager.Instance.Unregister<uint>(EventManager.EventName.ItemChange, OnItemChange);
EventManager.Instance.Unregister(EventManager.EventName.CharacterInfoRefresh, OnDataRefresh);
//CommonUtils.ScreenshotReset();
}
void OnItemChange(uint itemID)
{
foreach (var skinItem in recycleItem)
{
var SkinItemID = skinItem.Value.ItemID;
if (SkinItemID == itemID)
{
SkinScrollView.ShowList(VehiclePaintDic[CurType].Count);
}
}
SetCurSelectSkin(curSelectSkinID);
}
void OnDataRefresh()
{
DebugUtil.Log("OnDataRefresh");
var Vehiclecfg = Actor.Instance.Character.GetVehicleDevelopment(VehicleID);//.paint_set;
if (Vehiclecfg != null)
{
var paintSet = Vehiclecfg.paint_set;
curEquipSkinIDs.Clear();
foreach (var paint in paintSet)
{
curEquipSkinIDs.Add((int)paint);
}
}
SkinScrollView.ShowList(VehiclePaintDic[CurType].Count);
SetCurSelectSkin(curSelectSkinID);
}
void SetCurSelectSkin(int id)
{
curSelectSkinID = id;
var skinStatus = GetSkinStatus(id);
DebugUtil.Log("这段代码需要本地化文本");
switch (skinStatus)
{
case SkinStatus.Unlocked:
Button_Equipment.GetComponentInChildren<TMP_Text>().text = "装备皮肤";
break;
case SkinStatus.Equiped:
Button_Equipment.GetComponentInChildren<TMP_Text>().text = "已装备";
break;
case SkinStatus.Locked:
Button_Equipment.GetComponentInChildren<TMP_Text>().text = "购买";
break;
default:
DebugUtil.LogError("未知皮肤状态");
break;
}
}
public SkinStatus GetSkinStatus(int id)
{
DebugUtil.Log("GetSkinStatus id = " + id);
foreach (var skin in curEquipSkinIDs)
{
if (skin == curSelectSkinID)
{
return SkinStatus.Equiped;
}
}
var skinCfg = TableManager.Instance.Tables.VehiclePaint.GetOrDefault(curSelectSkinID);
if (skinCfg != null)
{
var itemID = skinCfg.ItemID;
if (CategoryManager.Instance.GetItemCount(itemID) > 0)//拥有皮肤时,显示可装配
{
return SkinStatus.Unlocked;
}
else//未拥有皮肤,显示可购买
{
return SkinStatus.Locked;
}
}
return SkinStatus.Locked;
}
void OnBack_Click()
{
CloseWindow();
}
void OnEquipButtonClick()
{
var Cfg = TableManager.Instance.Tables.VehiclePaint.GetOrDefault(curSelectSkinID);
var skinStatus = GetSkinStatus(curSelectSkinID);
switch (skinStatus)
{
case SkinStatus.Unlocked:
DebugUtil.Log("装备皮肤");
NetHelper.VehicleSetPaint((uint)Cfg.HostVehicle, (uint)Cfg.PaintID);
break;
case SkinStatus.Locked:
DebugUtil.Log("购买皮肤");
var cost = Cfg.PaintCost;
foreach(cfg.item.ItemCounts itemCounts in cost)
{
var itemCount = itemCounts.Count;
var itemID = itemCounts.Id;
if (CategoryManager.Instance.GetItemCount(itemID) < itemCount)
{
DebugUtil.Log("这里需要配置本地化");
CommonUtils.ShowMessageTips("资源不足");
return;
}
}
NetHelper.VehicleBuyPaint((uint)Cfg.HostVehicle, (uint)Cfg.PaintID);
break;
default:
DebugUtil.Log("");
break;
}
}
#region RecycleView
private void OnRefreshItem(GameObject cell, int index)
{
if (!recycleItem.TryGetValue(cell.GetInstanceID(), out SkinItem item))
{
item = new SkinItem(cell, OnSelectSkin);
recycleItem.Add(cell.GetInstanceID(), item);
}
item.SetInfo(VehiclePaintDic[CurType][index]);
item.RefreshSelected(curSelectSkinID);
}
public class SkinItem : UIGameObjectWrapper
{
int SkinID;
public int ItemID;
Action<int> callback;
public SkinItem(GameObject root, Action<int> OnClickCallback) : base(root)
{
callback = OnClickCallback;
}
public void SetInfo(DataVehiclePaint data)
{
SkinID = data.PaintID;
ItemID = data.ItemID;
GetComponent<TMP_Text>("Text_Name").text = data.PaintName;
var button = GoRoot.GetComponent<Button>();
var Mask = FindObj("Image_DrakHide");
var Locked = FindObj("Image_Locked");
var Equiped = FindObj("Image_CurrentEquipment");
bool unlock = VehicleDataHelper.IsVehicleSkinUnlock(data.PaintID);
if (Mask != null)
Mask.SetActive(!unlock);
if (Locked != null)
Locked.SetActive(!unlock);
bool isEquiped = false;
var vehicleID = data.HostVehicle;
var Vehiclecfg = Actor.Instance.Character.GetVehicleDevelopment(vehicleID);//.paint_set;
if (Vehiclecfg != null)
{
var paintSet = Vehiclecfg.paint_set;
foreach (var paint in paintSet)
{
if (paint == data.PaintID)
{
isEquiped = true;
break;
}
}
}
if (Equiped != null)
Equiped.SetActive(isEquiped);
button.onClick.RemoveAllListeners();
CommonUtils.BindButton(button, OnClick);
IsScaleShow = true;
}
private void OnClick()
{
callback?.Invoke(SkinID);
}
public void RefreshSelected(int SkinID)
{
var selected = FindObj("Image_SelectedBorder");
selected.SetActive(SkinID == this.SkinID);
}
}
void OnSelectSkin(int SkinID)
{
DebugUtil.Log("OnSelectSkin SkinID = " + SkinID);
SetCurSelectSkin(SkinID);
SkinScrollView.ShowList(VehiclePaintDic[CurType].Count);
}
#endregion
void OnTypeToggleClick(PaintType type)
{
CurType = type;
foreach (var toggle in toggles)
{
toggle.ResetLightBar(CurType);
}
SkinScrollView.ShowList(VehiclePaintDic[CurType].Count);
}
public class TypeToggle : UIGameObjectWrapper
{
Action<PaintType> callback;
GameObject lightBar;
PaintType toggleType;
public TypeToggle(GameObject root, PaintType toggleType, Action<PaintType> OnToggleCallback) : base(root)
{
lightBar = FindObj("LightBar");
callback = OnToggleCallback;
this.toggleType = toggleType;
var button = GetComponent<Button>();
CommonUtils.BindButton(button, OnButtonClick);
IsScaleShow = true;
}
void OnButtonClick()
{
callback?.Invoke(toggleType);
}
public void ResetLightBar(PaintType curPaintType)
{
lightBar.SetActive(curPaintType == toggleType);
}
}
}