using System.Collections.Generic; using UnityEngine; using System; using System.Linq; using ET; namespace GFGGame { public class DressUpObjDataCache { private GameObject _sceneObj; private bool _needSetMask; private EquipData _equipData = new EquipData(); public int bgId { get { return _equipData.bgId; } } public int suitId { get { return _equipData.suitId; } } public bool IsAction { get { return _equipData.suitId > 0 && _equipData.isAction; } } public bool HasSuitPicRes { get { if (_equipData.suitId > 0) { SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(_equipData.suitId); if (suitCfg.picRes != null && suitCfg.picRes.Length > 0) { return true; } } return false; } } public List equipDatas { get { return _equipData.equipDatas.ToList(); } set { if(value != null) { _equipData.equipDatas.Clear(); foreach(var t in value) { _equipData.equipDatas.Add(t); } } } } public void setSceneObj(GameObject sceneObj, bool needSetMask = false) { _sceneObj = sceneObj; _needSetMask = needSetMask; } public EquipData GetEquiptDataClone() { return _equipData.Clone(); } public void Dispose() { _sceneObj = null; } private void Add(int value) { if (!_equipData.equipDatas.Contains(value)) { _equipData.equipDatas.Add(value); DressUpUtil.AddItem(value, _sceneObj, _needSetMask); FightDataManager.Instance.score += ItemDataManager.GetItemAdditionScore(value, InstanceZonesDataManager.currentScoreType, InstanceZonesDataManager.currentFightTags); } int dressSuitId = CheckCurDressIsSuit(); if (dressSuitId > 0) _equipData.suitId = dressSuitId; } private void Remove(int value) { if (_equipData.equipDatas == null) { return; } if (_equipData.equipDatas.Contains(value)) { _equipData.equipDatas.Remove(value); DressUpUtil.RemoveItem(value, _sceneObj); FightDataManager.Instance.score -= ItemDataManager.GetItemAdditionScore(value, InstanceZonesDataManager.currentScoreType, InstanceZonesDataManager.currentFightTags); } } //检测当前穿戴是否是一件完整套装,且只穿了一件套装,返回套装id public int CheckCurDressIsSuit() { if (_equipData.suitId > 0) return _equipData.suitId; // var equipDatas = EquipData.equipDatas; int dressSuitId = 0; List equipDatas = new List(); for (int i = 0; i < _equipData.equipDatas.Count; i++) { if (DressUpMenuItemDataManager.CheckIsSceneType(_equipData.equipDatas[i])) continue; if (_equipData.equipDatas[i] != ConstItemID.DEFULT_FA_XING && _equipData.equipDatas[i] != ConstItemID.DEFULT_LIAN_YI_QUN && _equipData.equipDatas[i] != ConstItemID.DEFULT_NEI_DA && _equipData.equipDatas[i] != ConstItemID.DEFULT_XIA_ZHUANG) { int suitId = SuitCfgManager.Instance.GetItemSuitId(_equipData.equipDatas[i]); if (suitId <= 0) return 0;//有任何不属于套装的部件且不是原始服装,则当前穿戴不属于套装 if (dressSuitId != 0 && dressSuitId != suitId) return 0;//当前穿戴不同套装的部件,则当前穿戴不属于套装 dressSuitId = suitId; equipDatas.Add(_equipData.equipDatas[i]); } } if (dressSuitId == 0) return dressSuitId; int[] itemIds = SuitCfgManager.Instance.GetSuitItems(dressSuitId); for (int i = 0; i < itemIds.Length; i++) { if (DressUpMenuItemDataManager.CheckIsSceneType(itemIds[i])) continue; if (equipDatas.IndexOf(itemIds[i]) < 0) return 0;//套装部件穿戴不完整 } return dressSuitId; } /// /// 仅判断换装部件是否已穿着 /// /// /// public bool CheckDressUpItemIsOn(int id) { if (id == _equipData.bgId) { return true; } // if (suitId > 0) // { // int[] suitparts = SuitCfgArray.Instance.GetCfg(suitId).partsArr; // if (Array.IndexOf(suitparts, id) >= 0) // { // return true; // } // } return _equipData.equipDatas.Contains(id); } /// /// 仅判断套装是否穿上 /// /// /// public bool CheckSuitIsOn(int id) { SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(id); if (suitCfg == null) { return false; } int[] items = suitCfg.partsArr; foreach (int itemId in items) { bool isOn = CheckDressUpItemIsOn(itemId); if (!isOn) { return false; } } return true; } public void AddOrRemove(int value, bool checkDefault, bool isAdd = false, bool isRemove = false) { int subType = ItemUtilCS.GetItemSubType(value); if (subType == ConstDressUpItemType.BEI_JING) { _equipData.bgId = value; DressUpUtil.AddItem(_equipData.bgId, _sceneObj, _needSetMask); } else { if (!CheckDressUpItemIsOn(value)) { if (!isRemove) { checkRemoveSameType(subType); Add(value); } } else { if (!isAdd) { Remove(value); } } if (checkDefault) { checkDefaultItem(); } } } public void checkRemoveSameType(int type) { int count = 0; int firstTeshuId = 0; for (int i = 0; i < _equipData.equipDatas.Count; i++) { int itemID = (int)_equipData.equipDatas[i]; int subType = ItemUtilCS.GetItemSubType(itemID); if (subType == type || (type == ConstDressUpItemType.LIAN_YI_QUN && (subType == ConstDressUpItemType.SHANG_YI || subType == ConstDressUpItemType.XIA_ZHUANG || subType == ConstDressUpItemType.NEI_DA)) || (type == ConstDressUpItemType.SHANG_YI && subType == ConstDressUpItemType.LIAN_YI_QUN) || (type == ConstDressUpItemType.XIA_ZHUANG && subType == ConstDressUpItemType.LIAN_YI_QUN) || (type == ConstDressUpItemType.NEI_DA && subType == ConstDressUpItemType.LIAN_YI_QUN)) { Remove(itemID); i--; } if (subType > ConstDressUpItemType.TE_SHU) { if (count == 0) { firstTeshuId = itemID; } count++; } } if (type > ConstDressUpItemType.TE_SHU && count >= 3) { //特殊饰品最多穿三件,第四件会自动顶掉第一件 Remove(firstTeshuId); } } private void checkDefaultItem() { if (!IsAction) { //检查默认资源 //是否有头发 bool hasFaXing = false; //是否有连衣裙 bool hasLianYiQun = false; //是否有内搭 bool hasNeiDa = false; //是否有上衣 bool hasShangYi = false; //是否有下装 bool hasXiaZhuang = false; //是否有默认内搭 bool hasNeiDaDefault = false; //是否有默认下装 bool hasXiaZhuangDefault = false; for (int i = 0; i < _equipData.equipDatas.Count; i++) { int itemID = (int)_equipData.equipDatas[i]; int subType = ItemUtilCS.GetItemSubType(itemID); if (subType == (int)ConstDressUpItemType.FA_XING) { hasFaXing = true; } else if (subType == ConstDressUpItemType.LIAN_YI_QUN) { hasLianYiQun = true; } else if (subType == ConstDressUpItemType.NEI_DA) { hasNeiDa = true; } else if (subType == ConstDressUpItemType.XIA_ZHUANG) { hasXiaZhuang = true; } else if (subType == ConstDressUpItemType.SHANG_YI) { hasShangYi = true; } if (itemID == ConstItemID.DEFULT_NEI_DA) { hasNeiDaDefault = true; } else if (itemID == ConstItemID.DEFULT_XIA_ZHUANG) { hasXiaZhuangDefault = true; } } if (!hasFaXing) { Add(ConstItemID.DEFULT_FA_XING); } if (!hasLianYiQun) { if (!hasShangYi && (!hasNeiDa || hasNeiDaDefault) && (!hasXiaZhuang || hasXiaZhuangDefault)) { Remove(ConstItemID.DEFULT_XIA_ZHUANG); Remove(ConstItemID.DEFULT_NEI_DA); Add(ConstItemID.DEFULT_LIAN_YI_QUN); } else { if (!hasXiaZhuang) { Add(ConstItemID.DEFULT_XIA_ZHUANG); } if (!hasNeiDa) { Add(ConstItemID.DEFULT_NEI_DA); } } } } } private void InitRoleView() { } private void UpdateBodyView() { if (IsAction) { SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(_equipData.suitId); var hasAniRes = !string.IsNullOrEmpty(suitCfg.aniRes); var res = hasAniRes ? suitCfg.aniRes : suitCfg.picRes; DressUpUtil.UpdateBody(res, _sceneObj, hasAniRes, suitCfg.effRes); } else { DressUpUtil.UpdateBody(null, _sceneObj, false, null, _needSetMask); } } public void TakeOffAll(bool checkDefault = true) { _equipData.suitId = 0; _equipData.isAction = false; // AddOrRemove(propID, false, true); var tempList = equipDatas; foreach (int itemID in tempList) { AddOrRemove(itemID, false, false, true); } if (checkDefault) { checkDefaultItem(); UpdateBodyView(); } RoleLevelCfg roleLevelCfg = RoleLevelCfgArray.Instance.GetCfg(GameGlobal.myNumericComponent.GetAsInt(NumericType.Lvl)); FightDataManager.Instance.score = roleLevelCfg.baseScore; foreach (int itemId in _equipData.equipDatas) { FightDataManager.Instance.score += ItemDataManager.GetItemAdditionScore(itemId, InstanceZonesDataManager.currentScoreType, InstanceZonesDataManager.currentFightTags); } } public void ChangeAction() { if (!HasSuitPicRes) { return; } SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(_equipData.suitId); _equipData.isAction = !_equipData.isAction; if (IsAction) { var tempList = equipDatas; foreach (int itemId in tempList) { bool replaceableByAction = DressUpMenuSuitDataManager.CheckItemReaplaceableByAction(itemId, suitId); if (!DressUpMenuItemDataManager.CheckIsSceneType(itemId) && !replaceableByAction) { AddOrRemove(itemId, false, false, true); } } } else { int[] items = suitCfg.partsArr; foreach (int itemId in items) { bool replaceableByAction = DressUpMenuSuitDataManager.CheckItemReaplaceableByAction(itemId, suitId); if (!DressUpMenuItemDataManager.CheckIsSceneType(itemId) || replaceableByAction) { AddOrRemove(itemId, false, true); } } } checkDefaultItem(); UpdateBodyView(); } public void TryCancelSuit(int itemID) { if (_equipData.suitId > 0) { if (!DressUpMenuItemDataManager.CheckIsSceneType(itemID)) { if (_equipData.isAction) { ChangeAction(); } _equipData.suitId = 0; } } } public void UpdateRoleView() { PutOnEquipData(GetEquiptDataClone()); } /// /// 尝试穿戴配置套装 /// /// 套装id /// 检查是否是立绘 /// 是否排除场景类型 /// 排除类型列表 /// 是否显示可选部件 /// 是否只显示主角拥有的部件 public void PutOnSuitCfg(int id, bool checkPic, bool noSceneType, int[] excludeType = null, bool showOptional = true, bool CheckOwn = true) { if (_equipData.suitId == id) { return; } TakeOffAll(false); _equipData.suitId = id; _equipData.isAction = HasSuitPicRes && checkPic; SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(_equipData.suitId); List items = new List(suitCfg.partsArr); if (showOptional) { if (suitCfg.partsOptionalArr != null && suitCfg.partsOptionalArr.Length > 0) { items.AddRange(suitCfg.partsOptionalArr); } } int subType = 0; foreach (int itemId in items) { if (!CheckOwn || DressUpMenuItemDataManager.CheckHasItem(itemId)) { bool isSceneType = DressUpMenuItemDataManager.CheckIsSceneType(itemId); subType = ItemUtilCS.GetItemSubType(itemId); bool replaceableByAction = DressUpMenuSuitDataManager.CheckItemReaplaceableByAction(itemId, suitId); if (!_equipData.isAction || isSceneType || replaceableByAction) { if (!noSceneType || !isSceneType) { if (excludeType == null || Array.IndexOf(excludeType, subType) < 0) { AddOrRemove(itemId, false, true); } } } } } checkDefaultItem(); UpdateBodyView(); } public void PutOnSuitSavedByPos(int index, bool showBg = true) { CustomSuitData suitSavedData = CustomSuitDataManager.GetSuitList(index); PutOnEquipData(suitSavedData.EquipData, showBg); } public void PutOnEquipData(EquipData equipData, bool showBg = true) { TakeOffAll(false); if (showBg && equipData.bgId > 0) { AddOrRemove(equipData.bgId, false); } foreach (int itemID in equipData.equipDatas) { AddOrRemove(itemID, false, true); } _equipData.suitId = equipData.suitId; _equipData.isAction = equipData.isAction; checkDefaultItem(); UpdateBodyView(); } public void PutOnDefaultSuitSaved(bool showBg = true) { TakeOffAll(false); var equipData = EquipData.CreateDefault(); foreach (int itemID in equipData.equipDatas) { AddOrRemove(itemID, false, true); } if (showBg) { if (equipData.bgId > 0) { AddOrRemove(equipData.bgId, false); } } checkDefaultItem(); UpdateBodyView(); } public void PutOnItemList(List itemList) { TakeOffAll(false); foreach (int itemID in itemList) { AddOrRemove(itemID, false, true); } checkDefaultItem(); UpdateBodyView(); } public int GetItemIdBuyType(int subType) { for (int i = 0; i < equipDatas.Count; i++) { if (equipDatas[i] != ConstItemID.DEFULT_LIAN_YI_QUN && equipDatas[i] != ConstItemID.DEFULT_NEI_DA && equipDatas[i] != ConstItemID.DEFULT_XIA_ZHUANG && equipDatas[i] != ConstItemID.DEFULT_FA_XING) { if (subType == ItemUtilCS.GetItemSubType(equipDatas[i])) { return equipDatas[i]; } } } if (suitId > 0) { return suitId; } return 0; } } }