using System.Collections.Generic; using Excel2Json; using Fort23.Mono; using Fort23.UTool; using GameLogic.Bag; using GameLogic.Player; using UnityEditor; using UnityEngine; namespace GameLogic.Equipment { public class EqAddAttribute { public long atk; public long def; public long hp; // public void AddAtk(long atk) // { // this.atk += atk; // } // // public void AddDef(long def) // { // this.def += def; // } // // public void AddHp(long hp) // { // this.hp += hp; // } } public class EquipmentController { /// /// 所有的装备 按 这个逻辑存储 {职业, {部位, 装备列表}} /// 存在意义:一键换装的时候,可以快速找到目标装备 /// /// public Dictionary>> allZyEqDic = new Dictionary>>(); /// /// 已穿戴的装备 /// public Dictionary> equipZyEqDic = new Dictionary>(); /// /// 职业装备提供的属性 /// public Dictionary zyEqAddAttributeDic = new Dictionary(); // private long curGUID; public EquipmentController() { zyEqAddAttributeDic.Add(1, new EqAddAttribute()); zyEqAddAttributeDic.Add(2, new EqAddAttribute()); zyEqAddAttributeDic.Add(3, new EqAddAttribute()); zyEqAddAttributeDic.Add(4, new EqAddAttribute()); equipZyEqDic.Add(1, new List()); equipZyEqDic.Add(2, new List()); equipZyEqDic.Add(3, new List()); equipZyEqDic.Add(4, new List()); } public void Init(ItemInfo itemInfo) { AddEquipment(itemInfo); if (itemInfo.eqInfo != null && itemInfo.eqInfo.isWear) { AddToCurEquip(itemInfo, true); } } private void CalZyEqAddAttribute() { foreach (KeyValuePair> keyValuePair in equipZyEqDic) { int zy = keyValuePair.Key; ResetZyEqAddAttribute(zy); foreach (ItemInfo eqItem in keyValuePair.Value) { zyEqAddAttributeDic[zy].atk += eqItem.eqInfo.Attack; zyEqAddAttributeDic[zy].def += eqItem.eqInfo.Defense; zyEqAddAttributeDic[zy].hp += eqItem.eqInfo.Hp; } } } private void ResetZyEqAddAttribute(int zy) { zyEqAddAttributeDic[zy].atk = 0; zyEqAddAttributeDic[zy].def = 0; zyEqAddAttributeDic[zy].hp = 0; } /// /// 通过品质获取装备的额外参数,装备属性会叠加这个值 /// /// /// public float GetEquipmentRarityAttributeFactor(int quality) { int[] factors = PlayerManager.Instance.gameConstantConfig.equipmentRarityAttributeFactor; // LogTool.Log(quality); return factors[quality - 1] / (float)100; } public ItemInfo BuildEquipment(int equipModelDropID, int qualityDropID, int lvDropID) { ItemInfo info = null; List equipModelDropItems = DropManager.Instance.DropItem(equipModelDropID); if (equipModelDropItems == null || equipModelDropItems.Count == 0) { return info; } ItemInfo equipModelInfo = equipModelDropItems[0]; List qualityDropItems = DropManager.Instance.DropItem(qualityDropID); List lvDropItems = DropManager.Instance.DropItem(lvDropID); info = equipModelInfo; info.eqInfo = new EquipmentInfo(); // info.eqInfo.InitEquipment(info.config, // lvDropItems[0].dropItemConfig.itemID[0], // qualityDropItems[0].dropItemConfig.itemID[0]); info.eqInfo.InitEquipment(equipModelInfo, lvDropItems[0], qualityDropItems[0]); return info; } public ItemInfo BuildEquipmentForItemId(int itemId, int qualityDropID, int lvDropID) { ItemInfo info = null; ItemInfo equipModelInfo = new ItemInfo(itemId, 1); List qualityDropItems = DropManager.Instance.DropItem(qualityDropID); List lvDropItems = DropManager.Instance.DropItem(lvDropID); info = equipModelInfo; info.eqInfo = new EquipmentInfo(); // info.eqInfo.InitEquipment(info.config, // lvDropItems[0].dropItemConfig.itemID[0], // qualityDropItems[0].dropItemConfig.itemID[0]); info.eqInfo.InitEquipment(equipModelInfo, lvDropItems[0], qualityDropItems[0]); return info; } public bool atLeastOneBetterEq = false; /// /// 是否有更好的装备 /// /// 是否重新计算最好的装备 /// public bool IsBetterEqs(bool isReCal = true) { if (isReCal) { UpdateAllBestEqs(); } atLeastOneBetterEq = false; int count = 0; foreach (KeyValuePair> keyValuePair in allBestEqDic) { int zy = keyValuePair.Key; Dictionary bwDic = keyValuePair.Value; count += bwDic.Count; // if (bwDic.Count > 0) // { // // return true; // count++; // } } if (count >= 1) { atLeastOneBetterEq = true; } //有2个以上的职业,有更好准备是再显示最外层的小红点. if (count > 3) { return true; } return false; } /// /// 具体职业是否有更好装备 /// /// /// public bool IsBetterEqs4OneZy(int zy, bool isReCal = false) { if (isReCal) { UpdateAllBestEqs(); } if (allBestEqDic != null) { if (allBestEqDic.TryGetValue(zy, out var bwDic)) { if (bwDic.Count > 0) { return true; } } } return false; } public Dictionary> allBestEqDic; /// /// 计算所有职业最好的装备,用于小红点 /// allBestEqDic里面存的,就是所有职业,最好的装备 /// /// public Dictionary> UpdateAllBestEqs() { allBestEqDic = new Dictionary>(); allBestEqDic.Add(1, GetZyBestEqs(1)); allBestEqDic.Add(2, GetZyBestEqs(2)); allBestEqDic.Add(3, GetZyBestEqs(3)); allBestEqDic.Add(4, GetZyBestEqs(4)); return allBestEqDic; } public Dictionary GetZyBestEqs(int zy) { Dictionary bestEqDic = new Dictionary(); bool changed = false; //拿到这个职业的所有部位的装备,bwDic就是一个按部位划分的字典key=部位,value=这个部位下的所有装备 if (allZyEqDic.TryGetValue(zy, out var bwDic)) { foreach (KeyValuePair> keyValuePair in bwDic) { ItemInfo bestBwEq = null; foreach (ItemInfo bwItem in keyValuePair.Value) { // if (bwItem.eqInfo.isWear) // { // continue; // } // bwItem.eqInfo.isEquip = false; if (bestBwEq == null) { bestBwEq = bwItem; continue; } if (bwItem.eqInfo.Attack > bestBwEq.eqInfo.Attack || bwItem.eqInfo.Defense > bestBwEq.eqInfo.Defense || bwItem.eqInfo.Hp > bestBwEq.eqInfo.Hp) { bestBwEq = bwItem; } } if (bestBwEq != null) { if(!bestBwEq.eqInfo.isWear) bestEqDic.Add(keyValuePair.Key, bestBwEq); } } } return bestEqDic; } /// /// 一键穿职业装备 /// 把对应职业,对应部位的,最好的装备找出来 /// /// /// true = 有装备变动 public bool QuickEquip(int zy) { bool changed = false; //拿到这个职业的所有部位的装备,bwDic就是一个按部位划分的字典key=部位,value=这个部位下的所有装备 if (allZyEqDic.TryGetValue(zy, out var bwDic)) { foreach (KeyValuePair> keyValuePair in bwDic) { ItemInfo bestBwEq = null; foreach (ItemInfo bwItem in keyValuePair.Value) { // if (bwItem.eqInfo.isWear) // { // continue; // } // bwItem.eqInfo.isEquip = false; if (bestBwEq == null) { bestBwEq = bwItem; continue; } if (bwItem.eqInfo.Attack > bestBwEq.eqInfo.Attack || bwItem.eqInfo.Defense > bestBwEq.eqInfo.Defense || bwItem.eqInfo.Hp > bestBwEq.eqInfo.Hp) { bestBwEq = bwItem; } } if (bestBwEq != null) { bool b = AddToCurEquip(bestBwEq); if (!changed) { changed = b; } } } } return changed; } /// /// 把装备加到:当前已经穿的装备列表中管理 /// /// /// true 表示是初始化,初始化时,不支持保存数据的逻辑 /// public bool AddToCurEquip(ItemInfo bestEqItem, bool isInit = false) { int zy = bestEqItem.eqInfo.basicEquipConfig.profession; bool isAdd = true; if (equipZyEqDic.TryGetValue(zy, out var eqList)) { // 从后往前遍历,这样删除元素不会影响索引 for (int i = eqList.Count - 1; i >= 0; i--) { ItemInfo itemInfo = eqList[i]; if (itemInfo.eqInfo.basicEquipConfig.Type == bestEqItem.eqInfo.basicEquipConfig.Type) { //已经在已装备列表里面了,就不加了 if (itemInfo.Equals(bestEqItem)) { isAdd = false; } else { //老装备脱下来 EquipLogic(false, itemInfo); //从已装备的列表处,移除 eqList.RemoveAt(i); if (!isInit) { AccountFileInfo.Instance.SaveItemData(itemInfo); } } break; } } if (isAdd) { EquipLogic(true, bestEqItem); eqList.Add(bestEqItem); } } else { EquipLogic(true, bestEqItem); eqList = new List(); eqList.Add(bestEqItem); equipZyEqDic.Add(zy, eqList); } //有装备变更时,计算一下装备提供的属性 if (isAdd) { CalZyEqAddAttribute(); if (!isInit) { AccountFileInfo.Instance.SaveItemData(bestEqItem); } } return isAdd; } /// /// 穿/脱 装备的逻辑 /// /// 穿or脱 /// 装备item public void EquipLogic(bool equip, ItemInfo eqItemInfo) { eqItemInfo.eqInfo.isWear = equip; if (equip) { eqItemInfo.count.Value--; } else { eqItemInfo.count.Value++; } } /// /// 这里2次管理装备item的目的是为了:后续穿脱装备时,遍历效率更高 /// /// public void AddEquipment(ItemInfo eqItemInfo) { if (!eqItemInfo.IsEquipItem()) { return; } // allEqDic.Add(eqItemInfo.guid, eqItemInfo); int zy = eqItemInfo.eqInfo.basicEquipConfig.profession; int bw = eqItemInfo.eqInfo.basicEquipConfig.Type; if (allZyEqDic.TryGetValue(zy, out var bwDic)) { if (bwDic.TryGetValue(bw, out var eqBwList)) { bool isAdd = true; foreach (ItemInfo itemInfo in eqBwList) { if (itemInfo.guid == eqItemInfo.guid) { isAdd = false; // LogTool.Warning("已经有这个装备,不再重复添加:"+ eqItemInfo.guid); break; } } if (isAdd) { eqBwList.Add(eqItemInfo); } } else { eqBwList = new List(); eqBwList.Add(eqItemInfo); bwDic.Add(bw, eqBwList); } } else { bwDic = new Dictionary>(); List eqBwList = new List(); eqBwList.Add(eqItemInfo); bwDic.Add(bw, eqBwList); allZyEqDic.Add(zy, bwDic); } } // public void RemoveEquipment(ItemInfo eqItemInfo) // { // if (eqItemInfo.eqInfo == null) // { // return; // } // // int zy = eqItemInfo.eqInfo.basicEquipConfig.profession; // int bw = eqItemInfo.eqInfo.basicEquipConfig.Type; // // if (allZyEqDic.TryGetValue(zy, out var bwDic)) // { // if (bwDic.TryGetValue(bw, out var eqList)) // { // eqList.Remove(eqItemInfo); // } // else // { // LogTool.Error("移除一个在背包不存在的(bw),装备: guid=" + eqItemInfo.guid + " 职业=" + zy); // } // } // else // { // LogTool.Error("移除一个在背包不存在的(zy),装备: guid=" + eqItemInfo.guid + " 职业=" + zy); // } // // // if (zyEqDic.ContainsKey(pro) && zyEqDic[pro].Contains(eqItemInfo)) // // { // // zyEqDic[pro].Remove(eqItemInfo); // // } // // else // // { // // LogTool.Error("移除一个在背包不存在的,装备: guid=" + eqItemInfo.guid + " 职业=" + pro); // // } // } } }