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
}