using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using Newtonsoft.Json.Linq; using System.Linq; /// /// 玩家收集的英雄列表 /// public class GameCollectHero { /// /// 玩家获得英雄的数量上限 /// public int maxCollectCount = 100; /// /// 当前展示的角色ID /// public string showPlayerUID { get; set; } /// /// /// private string _firendSupportHeroUID; /// /// 当前展示好友支援的英雄ID /// public string firendSupportHeroUID { get { return _firendSupportHeroUID; } } /// /// 玩家收集的英雄数据集合 /// public Dictionary collectHeroDic = new Dictionary(); /// /// 记录已经解锁的 英雄的模板的ID的集合 /// key = 模板ID /// value = 0 未解锁 1解锁 /// public Dictionary recordUnLockHeroDic = new Dictionary(); /// /// 初始化玩家的圈养的英雄列表 /// /// public void InitData(JObject data, Player p) { recordUnLockHeroDic.Clear(); collectHeroDic.Clear(); showPlayerUID = LocalSettings.DisplayHeroUID; // 主屏显示英雄UID foreach (JProperty ele in (data["collectHeros"] as JObject).Properties()) { GameHeroVo vo = ConverJobjToData(ele.Value as JObject, p); vo.IsMyOwnerHero = true; collectHeroDic.Add(vo.uid, vo); } if (data["maxCollectCount"] != null) // 最大英雄数量 { maxCollectCount = data["maxCollectCount"].ToObject(); } else { maxCollectCount = int.Parse(GameConfigData.Ins.globalsettings.Game_CollectHero_BasicMaxCount.ToString()); } if (data["recordUnLockHeroDic"] != null) { recordUnLockHeroDic = data["recordUnLockHeroDic"].ToObject>(); } } /// /// Jobject数据转换为游戏内自定义的英雄数据结构 /// /// /// public static GameHeroVo ConverJobjToData(JObject ele, Player p) { GameHeroVo vo = ele.ToObject(); #warning "需要添加子技能id" //JObject subskillsObj = ele["subSkills"] as JObject; //if (null != subskillsObj) //{ // vo.subSkills = subskillsObj.ToObject>>(); //} vo.equips = new Dictionary(); JObject equipObj = ele["equip"] as JObject; if (equipObj != null) { foreach (JProperty st in equipObj.Properties()) { HeroGameVo_Equip ep = new HeroGameVo_Equip(); ep.equipType = st.Name; if (st.Value != null && st.Value.HasValues && !string.IsNullOrEmpty(st.Value.ToString())) { if (st.Value["itemuid"] != null) { ep.equipItemUID = st.Value["itemuid"].ToObject(); } else { ep.equipItemUID = "0"; } if (st.Value["level"] != null) { ep.level = st.Value["level"].ToObject(); } else { ep.level = 1; } } else { ep.equipItemUID = "0"; } vo.equips.Add(ep.equipType, ep); } } vo.yanling = new Dictionary(); JObject yanlingObj = JObject.Parse(ele["yanling"].ToString()); //JObject yanlingObj = ele["yanling"] as JObject; foreach (KeyValuePair kv in yanlingObj) { HeroGameVo_Yanling yanlingItem = new HeroGameVo_Yanling(); JObject jyanling = JObject.Parse(kv.Value.ToString()); var yluid = int.Parse(jyanling["itemuid"].ToString()); yanlingItem.itemuid = int.Parse(jyanling["itemuid"].ToString()); if (p.collectYanling.items.ContainsKey(yluid)) { yanlingItem.typeId = int.Parse(p.collectYanling.items[yluid].typeId); } vo.yanling.Add(int.Parse(kv.Key), yanlingItem); } return vo; } /// /// 获得新的英雄 /// /// public void AddNewHero(JObject ele) { GameHeroVo vo = ConverJobjToData(ele, UserProxy.Instance.player); vo.IsMyOwnerHero = true; collectHeroDic.Add(vo.uid, vo); } /// /// 更新英雄数据 /// /// public GameHeroVo UpdateHero(JObject ele) { GameHeroVo vo = ConverJobjToData(ele, UserProxy.Instance.player); vo.IsMyOwnerHero = true; if (collectHeroDic.ContainsKey(vo.uid)) { collectHeroDic[vo.uid].ReloadData(vo); } return collectHeroDic[vo.uid]; } /// /// 获得玩家收集的某个英雄的数据信息 /// /// 英雄模板ID /// public GameHeroVo GetHeroGameInfoByHeroUId(string uid) { if (!string.IsNullOrEmpty(uid)) { if (collectHeroDic.ContainsKey(uid)) { return collectHeroDic[uid]; } } return null; } /// /// 查找玩家 的某个英雄模板ID与参数一致 的 英雄的 /// /// /// public GameHeroVo GetHeroGameInfoByModelID(string modelId) { foreach (string key in collectHeroDic.Keys) { GameHeroVo vo = collectHeroDic[key]; if (vo.typeId == modelId) { return vo; } } return null; } /// /// 获得当前玩家拥有的英雄列表 /// /// public List GetAllHeroGameList() { List tempList = new List(); tempList.AddRange(collectHeroDic.Values); return tempList; } /// /// 检查某个装备,是否已经被某英雄使用了. /// /// 物品UID /// public bool CheckHasEquipSomeItem(string equipitemUId, out GameHeroVo queryResult) { queryResult = null; foreach (string key in collectHeroDic.Keys) { GameHeroVo vo = collectHeroDic[key]; foreach (string type in vo.equips.Keys) { if (equipitemUId == vo.equips[type].equipItemUID) { queryResult = vo; return true; } } } return false; } /// /// 检查主界面展示的英雄是否正确存在 /// 如果不存在的话,进行一下调整 /// false = 不存在 /// public bool CheckDisplayHeroIsExist() { GameHeroVo vo = UserProxy.Instance.player.collectHero.GetHeroGameInfoByHeroUId(showPlayerUID); if (vo == null) { if (collectHeroDic.Count > 0) { List all = GetAllHeroGameList(); ModifyDisplayHero(all[0].uid); } return false; } return true; } /// /// 计算玩家总战力(所有英雄战力之和) /// /// public int GetTotalFightPower() => this.collectHeroDic.Values.ToList().Sum(h => h.GetPower()); #region 整理 关于对英雄的数据修正入口函数整理 /// /// 关于玩家积攒的英雄的相关数据发生变化 /// 通知UI层,重新刷新显示的事件触发 /// 锁定 展示 好友支援等信息发生变化 /// public System.EventHandler RefreshUIViewHeroDataChangeEvent; /// /// 关于玩家的主界面展示的好友 发生变化 /// public System.EventHandler RefreshMainUIDisplayChangedEvent; /// /// 玩家装备的道具发生变化事件 /// public System.EventHandler RefreshUIViewHero_EquipChangeEvent; /// /// 对当前主界面展示的英雄进行修正 /// /// public void ModifyDisplayHero(string uid) { if (showPlayerUID != uid) { showPlayerUID = uid; LocalSettings.DisplayHeroUID = uid; GameCfg.SaveLocalSettings(); //---------------Event触发通知 相关的英雄的展示数据--------------------- if (RefreshMainUIDisplayChangedEvent != null) RefreshMainUIDisplayChangedEvent.Invoke(uid, EventArgs.Empty); } } /// /// 英雄的等级发生变化 /// /// /// /// /// public void ModifyGameHeroLevel(string uid, int newLv, int curXp, int curMaxXp) { if (collectHeroDic.ContainsKey(uid)) { GameHeroVo vo = collectHeroDic[uid]; vo.level = newLv; vo.xp = curXp; //vo.maxXp = curMaxXp; } //---------------Event触发通知 相关的英雄的展示数据--------------------- if (RefreshUIViewHeroDataChangeEvent != null) RefreshUIViewHeroDataChangeEvent.Invoke(uid, EventArgs.Empty); } /// /// 英雄装备的更改 /// /// /// public void ModifyHeroEquip(ItemVo tempItemvo, string uid) { if (collectHeroDic.ContainsKey(uid)) { switch (tempItemvo.nMo.itemType) { case 1: collectHeroDic[uid].equips["weapon"].equipItemUID = tempItemvo.uid; break; case 2: collectHeroDic[uid].equips["armor"].equipItemUID = tempItemvo.uid; break; case 3: collectHeroDic[uid].equips["ring"].equipItemUID = tempItemvo.uid; break; default: break; } } //-------------------------- Event触发通知 角色装备刷新 英雄的展示数据 --------------------------------------------- if (RefreshUIViewHero_EquipChangeEvent != null) { RefreshUIViewHero_EquipChangeEvent.Invoke(uid, EventArgs.Empty); } //---------------Event触发通知 角色属性界面刷新 英雄的展示数据--------------------- if (RefreshUIViewHeroDataChangeEvent != null) RefreshUIViewHeroDataChangeEvent.Invoke(uid, EventArgs.Empty); } #endregion }