using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
///
/// 角色[游戏数据]
///
public class GameHeroVo
{
///
/// 是否是我自己的英雄 Ps. 本字段为本地字段,未同步到网络.
/// 是我的= true, 其他人的= false
///
public bool IsMyOwnerHero = false;
///
/// 唯一ID
///
public string uid { get; set; } = "0";
///
/// 模板数据id
///
public string typeId { get; set; }
///
///当前的经验(角色吃经验丹获得经验从而使level值成长.)
///
public int xp { get; set; }
///
/// 当前等级进展,累计的总经验
///
public int maxXp
{
get
{
if (this.starLimitLv == this.level)
{
return xp;
}
var lvMo = GameConfigData.Ins.Gethero_levelexpMo(this.level + 1);
if (null != lvMo)
{
return lvMo.requiredExp;
}
return GameConfigData.Ins.Gethero_levelexpMo(this.level).requiredExp;
}
}
///
/// 当前等级(level值决定了其他属性如hp, phyAtk,等的成长(公式))
///
public int level { get; set; } = 1;
///
/// 品阶(S A B C D)(品阶可以通过吃碎片成长)
///
public string grade { get; set; } = "D";
///
/// 武器数据引用
///
internal GameCollectEquips EquipRef;
///
/// 言灵数据引用
///
internal GameCollectYanling YanlingRef;
#region 扩展功能标签
///
/// 判断自己是否是队长
///
public bool IsTeamLeader => UserProxy.Instance.player.heroTeamConfig.teamDic.Values.ToList().Exists(team => team.CurTeamLeaderUID == this.uid);
///
/// 判断自己是否已经有战队了
///
public bool IsInTeam => int.Parse(this.uid) > 0 && UserProxy.Instance.player.heroTeamConfig.teamDic.Values.ToList().Exists(team => team.heros.Contains(this.uid));
///
/// 是否可升级, 玩家等级限制英雄等级
///
///
public bool HeroCanLevelUp => this.level < (sm_playerlevel.getUserLvById(UserProxy.Instance.player.baseInfo.level)?.hero_max_level ?? 15); // 找不到配置数据, 默认最大15级
///
/// 英雄的模板数据源
///
public sm_hero mo => sm_hero.GetMoByID(this.typeId);
#endregion
#region 技能
// UNDONE : 技能部分梳理好,补充这里 -- 王刚 2019年12月4日
// 原来 : 普通技能, 手动1, 手动2, 被动技能和队长技能.
// 新的 : 普攻、必杀、被动、闪避、队长技
///
/// 技能等级信息记录
/// key 为技能ID,value为技能对应的等级
///
[Obsolete("旧技能信息", true)]
public Dictionary skillDic = new Dictionary();
///
/// 子技能列表(子技能id)
///
public Dictionary> subSkills = new Dictionary>();
///
/// 查询可解锁技能列表
///
///
public List GetUnlockAbleSkills(int mainSkillId)
{
var li = new List();
var ssl = sm_subSkill.GetSubSkillsByMainSkillId(mainSkillId) // 取主技能对应的子技能集合
.Where(sm => sm.level == 1); // 未解锁,限定为1级技能
foreach (var sm in ssl)
{
bool find = false;
if (this.subSkills.ContainsKey(mainSkillId)) // 防御
{
var itor_sm = sm;
if (this.subSkills[mainSkillId].Contains(itor_sm.subSkillId))
{
find = true;
}
else
{
while (itor_sm.nextLevel_Id > 0)
{ // 整个链条上的id都判断一遍
if (this.subSkills[mainSkillId].Contains(itor_sm.nextLevel_Id))
{
find = true;
break;
}
itor_sm = sm_subSkill.GetMoById(itor_sm.nextLevel_Id);
}
}
}
if (!find && sm.canUnlock(this)) // 英雄子技能列表中不包含的id判定为待解锁状态
{
li.Add(sm);
}
}
return li;
}
///
/// 查询可升级子技能
///
///
public List GetUpdateAbleSkills(int mainSkillId)
{
var li = new List();
if (this.subSkills.ContainsKey(mainSkillId))
{
foreach (var id in this.subSkills[mainSkillId])
{
var sk = sm_subSkill.GetMoById(id);
if (sk.canUpgrade(this))
{
li.Add(sk);
}
}
}
return li;
}
///
/// 取一个主技能底下的所有子技能
///
///
///
public List GetSubSkills(int mainSkillId)
{
var li = new List();
var ssl = sm_subSkill.GetSubSkillsByMainSkillId(mainSkillId) // 取主技能对应的子技能集合
.Where(sm => sm.level == 1); // 未解锁,限定为1级技能
foreach (var sm in ssl)
{
bool find = false;
if (this.subSkills.ContainsKey(mainSkillId)) // 防御
{
var itor_sm = sm;
if (this.subSkills[mainSkillId].Contains(itor_sm.subSkillId))
{
find = true;
li.Add(sm);
continue;
}
else
{
while (itor_sm.nextLevel_Id > 0)
{ // 整个链条上的id都判断一遍
if (this.subSkills[mainSkillId].Contains(itor_sm.nextLevel_Id))
{
find = true;
break;
}
itor_sm = sm_subSkill.GetMoById(itor_sm.nextLevel_Id);
}
}
}
if (!find) // 英雄子技能列表中不包含的id判定为待解锁状态
{
li.Add(sm);
}
}
return li;
}
///
/// 队长技
///
///
public sm_skill SkillLeader()
{
return sm_skill.GetMoByID(int.Parse(this.mo.skill_leader));
}
///
/// 普通攻击技能
///
///
public sm_skill SkillNormal()
{
return sm_skill.GetMoByID(int.Parse(this.mo.GetNormalSkills()[0]));
//return sm_skill.GetMoByID(int.Parse(this.mo.skill_normal));
}
///
/// 必杀技
///
///
public sm_skill SkillBisha()
{
return sm_skill.GetMoByID(int.Parse(this.mo.skill_bisha));
}
///
/// 闪避/冲刺
///
///
public sm_skill SkillShanbi()
{
return sm_skill.GetMoByID(int.Parse(this.mo.skill_shanbi));
}
///
/// 被动技
///
///
public sm_skill SkillBeidong()
{
return sm_skill.GetMoByID(int.Parse(this.mo.skill_beidong));
}
#endregion
/* 一个英雄 有3个装备槽: waepon、armor、ring */
#region 装备
///
/// 英雄的装备信息
/// key = [waepon. armor. ring]
/// value = 装备UID
///
public Dictionary equips = new Dictionary();
///
/// 拉取本英雄可用的装备列表
///
///
public List UsableWeapons()
{
return UserProxy.Instance.player.collectEquip.FindUseableEquips(int.Parse(this.typeId));
}
#endregion
/* 一个英雄 有3个言灵槽: left:1、middle:2、right:3 */
#region 言灵
///
/// 英雄的言灵信息 (暂时先用字符串吧,优化的时候再说(王刚2020年1月2日18:50:53))
/// key = [1. 2. 3]
///
public Dictionary yanling = new Dictionary();
///
/// 英雄的言灵信息---新的 2021.6.22
///
public Dictionary hero_yanling
{
get
{
Dictionary dic = new Dictionary();
foreach (KeyValuePair kv in this.yanling)
{
if (UserProxy.Instance.player.collectYanling.items.ContainsKey(kv.Value.itemuid))
{
UserYanlingVo vo = UserProxy.Instance.player.collectYanling.items[kv.Value.itemuid];
dic[kv.Key] = vo;
}
else
{
UserYanlingVo vo = new UserYanlingVo();
dic[kv.Key] = vo;
}
}
return dic;
}
}
///
/// 拉取本英雄可用的言灵列表
///
///
public List UsableYanling()
{
return UserProxy.Instance.player.collectYanling.FindUseableYanlings(int.Parse(this.typeId));
}
///
/// 当前英雄装配的言灵套系属性加成
///
public List hero_yanlingComposeAttr
{
get
{
List list = new List();
List cIdList = new List();
foreach (KeyValuePair kv in this.hero_yanling)
{
if (kv.Value.typeId == null)
{
continue;
}
int id = kv.Value.nMo.GetYanlingExt().composeId;
cIdList.Add(id);
}
if (cIdList.Count == 0)
{
return list;
}
int count = 0;
int composeId = 0;
foreach (var item in cIdList.GroupBy(c => c))
{
int n = item.Count();
if (count < n)
{
count = n;
composeId = item.Key;
}
}
if (composeId == 0)
{
return list;
}
if (count <= 1)
{
return list;
}
sm_yanling_compose mo = GameConfigData.Ins.Getyanling_composeMo(composeId);
if (mo == null)
{
return list;
}
string[] twoList = mo.two_compose.Split(',');
int attrType = int.Parse(twoList[0]);
yanlingComposeDataVo vo = new yanlingComposeDataVo();
vo.composeId = composeId;
vo.isShow = false;
if (count >= 2)
{
vo.isShow = true;
}
vo.attr = (EHeroAddProperties)attrType;
vo.desc = mo.two_desc;
vo.attrName = mo.name;
vo.type = int.Parse(twoList[1]);
vo.val = int.Parse(twoList[2]);
list.Add(vo);
//sm_yanling_compose newMo = GameConfigData.Ins.Getyanling_composeMo(composeId);
string[] threeList = mo.three_compose.Split(',');
int attrType_3 = int.Parse(threeList[0]);
yanlingComposeDataVo vo_3 = new yanlingComposeDataVo();
vo_3.composeId = composeId;
vo_3.isShow = false;
if (count >= 3)
{
vo_3.isShow = true;
}
vo_3.attr = (EHeroAddProperties)attrType_3;
vo_3.desc = mo.three_desc;
vo_3.attrName = mo.name;
vo_3.type = int.Parse(threeList[1]);
vo_3.val = int.Parse(threeList[2]);
list.Add(vo_3);
return list;
}
}
public string yanlingComseName
{
get
{
if (this.hero_yanlingComposeAttr.Count == 0)
{
return "";
}
if (this.hero_yanlingComposeAttr[0].composeId == 0)
{
return "";
}
sm_yanling_compose mo = GameConfigData.Ins.Getyanling_composeMo(this.hero_yanlingComposeAttr[0].composeId);
if (mo == null)
{
return "";
}
return mo.name;
}
}
#endregion
#region 过时
///
/// 英雄锁定状态()
/// true= 被锁定
/// false = 未锁定
///
[Obsolete("")]
public bool isLocked { get; set; }
///
/// 当前等阶 默认是0--------这个应该是废弃的-----2022-7-13最新注释:这个字段最开始应该是星级,后来升星功能改变用curStar字段了
/// 这个字段是废弃的
/// 0 1 2 3 4 5
/// 绿 蓝 红 紫 橙
///
[Obsolete("新规划只有等级和等阶两个强化 维度 ")]
public int strengthLevel { get; set; }
///
/// //升星
/// 当前星级 默认是0星
///
public int curStar { get; set; }
///
/// 默认的当前神血等级
/// 默认是0
/// 最大是9 ~~~
///
[Obsolete("新规划只有等级和等阶两个强化 维度 ")]
public int curBloodId { get; set; }
///
/// 当前星级限制的等级
///
public int starLimitLv
{
get
{
sm_heroextra_level_tupo mo = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar);
if (mo == null)
{
return 0;
}
return mo.promoteLv;
}
}
///
/// 突破的玩家等级限制
///
public int userLimitLv
{
get
{
if (this.curStar >= 5)
{
return 0;
}
sm_heroextra_level_tupo mo = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1);
return mo.userlvLimit;
}
}
///
/// 是不是升级按钮 true:是
///
public bool isUpgrade
{
get
{
if (this.curStar >= 5)
{
return true;
}
//&& UserProxy.Instance.player.baseInfo.level >= sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).userlvLimit
if (this.level >= this.starLimitLv)
{
return false;
}
return true;
}
}
///
/// 消耗的道具----突破
///
public List costItem_tupo
{
get
{
List list = new List();
if (this.curStar >= 5)
{
return list;
}
sm_heroextra_level_tupo mo = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1);
string[] sList = mo.costItems.Split(';');
foreach (string item in sList)
{
string[] str = item.Split(',');
ItemVo vo = new ItemVo();
vo.typeId = str[0];
vo.count = int.Parse(str[1]);
list.Add(vo);
}
ItemVo itVo = new ItemVo();
itVo.typeId = mo.segID.ToString();
itVo.count = mo.segNum;
list.Add(itVo);
return list;
}
}
///
/// 升级消耗道具
///
public List costItem_up
{
get
{
List list = new List();
Dictionary item_stonesMo = GameConfigData.Ins.item_stones;
Dictionary cDic = UserProxy.Instance.player.collectItem.collectItemDic;
foreach (KeyValuePair kv in item_stonesMo)
{
if (cDic.ContainsKey(kv.Key.ToString()))
{
list.Add(cDic[kv.Key.ToString()]);
}
}
return list;
}
}
///
/// 当前金币值
///
public int curGold
{
get
{
return UserProxy.Instance.player.baseInfo.gold;
}
}
///
/// 突破需要的金币
///
public int costGold_tupo
{
get
{
if (this.curStar >= 5)
{
return 0;
}
sm_heroextra_level_tupo mo = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1);
return mo.gold;
}
}
///
/// 唤灵师星级限制的等级下的经验最大值
///
public int lvLimitMaxExp
{
get
{
Dictionary hero_levelexp = GameConfigData.Ins.hero_levelexp;
int n = 0;
foreach (KeyValuePair kv in hero_levelexp)
{
if (kv.Key <= this.level)
{
continue;
}
n += kv.Value.needExp;
if (kv.Key > this.starLimitLv)
{
break;
}
}
return n;
}
}
#endregion
#region 新增 方法
///
/// 英雄增加经验
///
///
///
public int AddExp(int add)
{
var maxLevel = GlobalParameter.Instance.Hero_Upgrade_BasicMaxLevel; // 最大等级
if (this.level >= maxLevel)
{
return 0; // 已达顶级
}
var lvMo = GameConfigData.Ins.Gethero_levelexpMo(this.level + 1);
this.xp += add;
Debug.Assert(this.xp >= 0, "[" + this.uid + "] : HeroExp is negative!");
while (this.xp >= lvMo.needExp)
{
if (this.level < maxLevel)
{ // 如果未到达最大等级
//var nextlv = this.level + 1;
this.level += 1;
if (this.level >= maxLevel)
{
this.xp = lvMo.needExp;
}
else
{
this.xp -= lvMo.needExp;
}
//this.maxXp = lvMo.needExp;
lvMo = GameConfigData.Ins.Gethero_levelexpMo(this.level + 1);
}
else
{ // 如果已到达最大等级则仅补齐缺失的经验即可
this.xp = this.maxXp; // 经验不能超过最大值
break;
}
}
return this.xp;
}
///
/// 克隆方法
///
///
public GameHeroVo Clone()
{
return (GameHeroVo)this.MemberwiseClone();
}
///
/// 是否已经拥有(解锁)此英雄
///
public bool IsOwned
{
get
{
return (!string.IsNullOrWhiteSpace(this.uid) && int.Parse(this.uid) > 0); // 拥有实例id代表已经拥有此英雄
}
}
#region undone: 装备、言灵
///
/// 获取英雄装备的武器信息(待补完)
///
///
public HeroGameVo_Equip GetWeapon()
{
return this.equips["weapon"];
//// todo: 待武器模块补完后, 修补这里. --wg 2019年12月4日13:50:40
//return null;
}
///
/// 获取已经装备的言灵信息
///
public void GetYanlingInfo()
{
// todo: 待言灵模块添加后, 修补这里. --王刚 2019年12月4日
}
#endregion
#region 升级与进阶
///
/// 废弃
///
public sm_heroextra_level mo_Grade_cur
{
get
{
return sm_heroextra_level.GetMoById(this.mo.heroId, this.grade);
}
}
public string nextGrade
{
get
{
var cur = (EHeroQuality)Enum.Parse(typeof(EHeroQuality), this.grade);
return (cur + 1).ToString();
}
}
public sm_heroextra_level nextGradeMo
{
get
{
return sm_heroextra_level.GetMoById(this.mo.heroId, this.nextGrade);
}
}
///
/// 下一等级
///
public int nextLevel
{
get
{
var next = this.level + 1;
if (next > sm_hero_levelexp.GetMaxLevel()) // 最大等级校验 -wg 2019年12月4日17:26:19
{
next = sm_hero_levelexp.GetMaxLevel();
}
return next;
}
}
public sm_hero_levelexp mo_HeroLevelExp_cur { get { return sm_hero_levelexp.GetMoById(this.level); } }
public sm_hero_levelexp mo_HeroLevelExp_next { get { return sm_hero_levelexp.GetMoById(this.nextLevel); } }
///
/// 想要升阶还需再获得多少个碎片
///
public int upGradeNeedMoreSegments
{
get
{
if (this.grade == "S")
{
return 0; // 已经达到顶级
}
var needNum = this.NextGradeRequireSegNumber - HasSegNub;
return needNum > 0 ? needNum : 0;
}
}
///
/// 拥有碎片数量
///
public int HasSegNub { get { return UserProxy.Instance.player.collectItem.GetItemCount(this.mo_segment.typeId.ToString()); } }
///
/// 进阶到下一阶要求的碎片数量
///
public int NextGradeRequireSegNumber
{
get { return this.nextGradeMo.segNum; }
}
///
/// 对应的碎片mo
///
public sm_item_base mo_segment
{
get
{
var seg = sm_item_segment.GetMoByHeroId(int.Parse(this.typeId));
return sm_item_base.GetMoById(seg.typeId);
}
}
///
/// 碎片图标
///
public string SegmentIcon
{
get
{
return mo_segment.icon;
}
}
#endregion
#endregion
#region 方法
// todo: 下面的代码尚未整理 -wg 2019年12月4日
///
/// 根据查询的技能类型,获取该类型技能对应的等级信息
///
/// "normalSkill","manuSkill1","manuSkill2","passiveSkill",
///
[Obsolete("2019年12月31日", true)]
public int GetSkillLevel(string skillType)
{
int level = 1;
if (skillDic.ContainsKey(skillType))
{
level = skillDic[skillType];
}
return level;
}
///
/// 获取该角色战斗力数值
/// 生命值+物理攻击*4+魔法强度*4+护甲*5+魔抗*5
///
///
public int GetPower()
{
return (int)(getHpForBattle() * 1.0f
+ getNengLiangZhiJiForBattle() * 0
+ getWuLiGongJiForBattle() * 4
+ getFaShuQiangDuForBattle() * 4
+ getFangYuHuJiaForBattle() * 5
+ getMoFaKangXingForBattle() * 5
);
}
///
/// 获得角色装备的 物品提供的属性加成
///
///
///
protected float getEquipExtraProperty(EHeroProperties attribute)
{
float result = 0;
if (this.equips.Count == 0)
{
return result;
}
Player player = UserProxy.Instance.player;
foreach (string key in equips.Keys)
{
HeroGameVo_Equip vo = equips[key];
if (player.collectEquip.equipments.ContainsKey(int.Parse(vo.equipItemUID)))
{
Dictionary baseAttr = player.collectEquip.equipments[int.Parse(vo.equipItemUID)].baseAttr;
if (baseAttr.ContainsKey(attribute))
{
result += baseAttr[attribute];
}
}
}
return result;
#region
/*
if (!IsMyOwnerHero)
{
foreach (string key in equips.Keys)
{
//todo: 这两处, 通过itemId去Ref里面查找实例,计算加成.
HeroGameVo_Equip vo = equips[key];
if (EquipRef.equipments.ContainsKey(int.Parse(vo.equipItemUID)))
{
ItemVo item = EquipRef.equipments[int.Parse(vo.equipItemUID)];
var wp = item.nMo.GetWeaponExt();
switch (attribute)
{
case EHeroProperties.WULIGONGJI:
result += wp.phyAtk;
break;
case EHeroProperties.FASHUQIANGDU:
result += wp.fashuqiangdu;
break;
case EHeroProperties.CRICITAL:
result += wp.crit;
break;
}
}
}
}
else
{
Player player = UserProxy.Instance.player;
foreach (string key in equips.Keys)
{
HeroGameVo_Equip vo = equips[key];
if (player.collectEquip.equipments.ContainsKey(int.Parse(vo.equipItemUID)))
{
ItemVo item = player.collectEquip.equipments[int.Parse(vo.equipItemUID)];
var wp = item.nMo.GetWeaponExt();
switch (attribute)
{
case EHeroProperties.WULIGONGJI:
result += wp.phyAtk;
break;
case EHeroProperties.FASHUQIANGDU:
result += wp.fashuqiangdu;
break;
case EHeroProperties.CRICITAL:
result += wp.crit;
break;
}
}
}
}
return result;
*/
#endregion
}
///
/// 获得角色装备的言灵提供的属性加成
///
///
///
protected float getYanlingExtraProperty(EHeroProperties attribute)
{
float result = 0;
if (this.hero_yanling.Count == 0)
{
return result;
}
foreach (KeyValuePair kv in this.hero_yanling)
{
if (kv.Value.typeId != null)
{
Dictionary baseAttr = kv.Value.baseAttr;
if (baseAttr.ContainsKey(attribute))
{
int baseNum = baseAttr[attribute];
Dictionary rAttr = kv.Value.randAttr;
Dictionary gRandAttr = kv.Value.gemrRandAttr;
List ylComposeAttr = kv.Value.yanlingComposeAttr;
int attr = (int)attribute;
int add = 0;
if (rAttr.ContainsKey((EHeroAddProperties)attr))
{
add += rAttr[(EHeroAddProperties)attr];
}
if (gRandAttr.ContainsKey((EHeroAddProperties)attr))
{
add += gRandAttr[(EHeroAddProperties)attr];
}
if (ylComposeAttr.Count != 0)
{
foreach (yanlingComposeDataVo vo in ylComposeAttr)
{
if (vo.isShow == false)
{
continue;
}
if (vo.attr == (EHeroAddProperties)attr)
{
add += vo.val;
}
}
}
result += 1.0f * add / 100 * baseNum + baseNum;
}
}
}
return result;
#region
/*
if (IsMyOwnerHero)
{
foreach (var yl in this.yanling)
{
if (yl.Value != null && yl.Value.itemuid > 0) // 判断是否装备了言灵
{
var mo = yl.Value.Mo().GetYanlingExt();
if (mo != null)
{
switch (attribute)
{
case EHeroProperties.HP:
result += mo.TrueHp;
break;
case EHeroProperties.WULIGONGJI:
result += mo.TruePhyAtk;
break;
case EHeroProperties.FASHUQIANGDU:
result += mo.TrueFashuqiangdu;
break;
case EHeroProperties.CRICITAL:
result += mo.TrueCrit;
break;
case EHeroProperties.FANGYUHUJIA:
result += mo.TruePhyDef;
break;
case EHeroProperties.MOFAKANGXING:
result += mo.TrueMofakangxing;
break;
default:
break;
}
}
}
}
}
else
{
// 非玩家数据,暂定为空
foreach (var yl in this.yanling)
{
if (yl.Value.itemuid > 0) // 判断是否装备了言灵
{
var itemId = yl.Value.typeId;
var mo = sm_item_base.GetMoById(itemId).GetYanlingExt();
if (mo != null)
{
switch (attribute)
{
case EHeroProperties.HP:
result += mo.TrueHp;
break;
case EHeroProperties.WULIGONGJI:
result += mo.TruePhyAtk;
break;
case EHeroProperties.FASHUQIANGDU:
result += mo.TrueFashuqiangdu;
break;
case EHeroProperties.CRICITAL:
result += mo.TrueCrit;
break;
case EHeroProperties.FANGYUHUJIA:
result += mo.TruePhyDef;
break;
case EHeroProperties.MOFAKANGXING:
result += mo.TrueMofakangxing;
break;
default:
break;
}
}
}
}
}
return result;
*/
#endregion
}
///
/// 血量
///
///
protected float getHp()
{
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.HP, level, grade);
}
///
/// 言能
///
///
public float getNengLiangZhi()
{
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.NENGLIANGZHI, level, grade);
}
///
/// 言攻
///
///
protected float getFaShuQiangDu()
{
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.FASHUQIANGDU, level, grade);
}
///
/// 言抗
///
///
protected float getMoFaKangXing()
{
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.MOFAKANGXING, level, grade);
}
///
/// 物攻
///
///
protected float getWuLiGongJi()
{
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.WULIGONGJI, level, grade);
}
///
/// 物抗
///
///
protected float getFangYuHuJia()
{
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.FANGYUHUJIA, level, grade);
}
///
/// 暴击
///
///
protected float getCritical()
{
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.CRICITAL, level, grade);
}
[Obsolete("去掉攻速了-2019年12月4日")]
protected float getGongJiSuDu()
{
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.GONGJISUDU, level, grade);
}
protected float getKangbaoji()
{
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.KANGBAOJI, level, grade);
}
protected float getYanli()
{
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.YANLI, level, grade);
}
#region 战斗战斗 为战斗提供的人物的属性数值 基础属性 * 升级加成 + 升星加成 + 升阶加成 + 装备加成 + 言灵加成 、、、
/* 2019年12月4日 大概公式: 基础值*等级加成 + 武器加成 + 言灵加成 后面补完. */
///
/// 当前的属性值 【2022-1-19】
///
///
public int getHpForBattle()
{
//基础值+ 升级给的加成+
return (int)(getHp() // 英雄数据
+ getEquipExtraProperty(EHeroProperties.HP) // 武器数据
+ getYanlingExtraProperty(EHeroProperties.HP)
); // 言灵数据
}
///
/// 角色突破升星时当前的属性---2022-7-13修改
///
///
public float getHpForBattle_PrimaryGrade()
{
return this.getHp(); // 言灵数据
}
///
/// 突破后的唤灵师的属性
///
///
public float getHpForBattle_NextGrade()
{
string gradeNew = "S";
if (this.curStar < 5)
{
gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality;
}
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.HP, this.level, gradeNew);
////基础值+ 升级给的加成+
//return (int)(heroAr // 英雄数据
// + getEquipExtraProperty(EHeroProperties.HP) // 武器数据
// + getYanlingExtraProperty(EHeroProperties.HP)
// ); // 言灵数据
}
public int getNengLiangZhiJiForBattle()
{
return (int)(getNengLiangZhi() // 英雄本身
+ getEquipExtraProperty(EHeroProperties.NENGLIANGZHI) // + 武器加成
+ getYanlingExtraProperty(EHeroProperties.NENGLIANGZHI) // + 言灵加成
);
}
public float getNengliangzhi_PrimaryGrade()
{
return this.getNengLiangZhi();
}
///
/// 突破后的唤灵师的属性
///
///
public float getNengliangzhiForBattle_NextGrade()
{
string gradeNew = "S";
if (this.curStar < 5)
{
gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality;
}
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.NENGLIANGZHI, this.level, gradeNew);
//return (int)(heroAr // 英雄数据
// + getEquipExtraProperty(EHeroProperties.NENGLIANGZHI) // 武器数据
// + getYanlingExtraProperty(EHeroProperties.NENGLIANGZHI)
// );
}
///
/// 当前唤灵师属性
///
///
public int getWuLiGongJiForBattle()
{
return (int)(getWuLiGongJi()
+ getEquipExtraProperty(EHeroProperties.WULIGONGJI)
+ getYanlingExtraProperty(EHeroProperties.WULIGONGJI)
);
}
public float getWuLiGongJiForBattle_PrimaryGrade()
{
return this.getWuLiGongJi();
}
///
/// 突破后的唤灵师的属性
///
///
public float getWuLiGongJiForBattle_NextGrade()
{
string gradeNew = "S";
if (this.curStar < 5)
{
gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality;
}
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.WULIGONGJI, this.level, gradeNew);
//return (int)(heroAr // 英雄数据
// + getEquipExtraProperty(EHeroProperties.WULIGONGJI) // 武器数据
// + getYanlingExtraProperty(EHeroProperties.WULIGONGJI)
// );
}
public int getFaShuQiangDuForBattle()
{
return (int)(getFaShuQiangDu()
+ getEquipExtraProperty(EHeroProperties.FASHUQIANGDU)
+ getYanlingExtraProperty(EHeroProperties.FASHUQIANGDU)
);
}
public float getFaShuQiangDuForBattle_PrimaryGrade()
{
return this.getFaShuQiangDu();
}
public float getFaShuQiangDuForBattle_NextGrade()
{
string gradeNew = "S";
if (this.curStar < 5)
{
gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality;
}
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.FASHUQIANGDU, level, gradeNew);
//return (int)(heroAr
// + getEquipExtraProperty(EHeroProperties.FASHUQIANGDU)
// + getYanlingExtraProperty(EHeroProperties.FASHUQIANGDU)
// );
}
public int getMoFaKangXingForBattle()
{
return (int)(getMoFaKangXing()
+ getEquipExtraProperty(EHeroProperties.MOFAKANGXING)
+ getYanlingExtraProperty(EHeroProperties.MOFAKANGXING)
);
}
public float getMoFaKangXingForBattle_PrimaryGrade()
{
return this.getMoFaKangXing();
}
public float getMoFaKangXingForBattle_NextGrade()
{
string gradeNew = "S";
if (this.curStar < 5)
{
gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality;
}
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.MOFAKANGXING, level, gradeNew);
}
///
/// 当前唤灵师属性
///
///
public int getFangYuHuJiaForBattle()
{
return (int)(getFangYuHuJia()
+ getEquipExtraProperty(EHeroProperties.FANGYUHUJIA)
+ getYanlingExtraProperty(EHeroProperties.FANGYUHUJIA)
);
}
public float getFangYuHuJiaForBattle_PrimaryGrade()
{
return this.getFangYuHuJia();
}
///
/// 突破后的唤灵师属性
///
///
public float getFangYuHuJiaForBattle_NextGrade()
{
string gradeNew = "S";
if (this.curStar < 5)
{
gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality;
}
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.FANGYUHUJIA, level, gradeNew);
//return (int)(heroAr
// + getEquipExtraProperty(EHeroProperties.FANGYUHUJIA)
// + getYanlingExtraProperty(EHeroProperties.FANGYUHUJIA)
// );
}
[Obsolete("取消攻速了")]
public float getGongJiSuDuForBattle()
{
return (getGongJiSuDu()
+ getEquipExtraProperty(EHeroProperties.GONGJISUDU));
}
///
/// 暴击
///
///
public int getCriticalForBattle()
{
Debug.Log("基础暴击:" + getCritical());
Debug.Log("武器暴击:" + getEquipExtraProperty(EHeroProperties.CRICITAL));
Debug.Log("言灵暴击:" + getYanlingExtraProperty(EHeroProperties.CRICITAL));
return (int)(getCritical()
+ getEquipExtraProperty(EHeroProperties.CRICITAL)
+ getYanlingExtraProperty(EHeroProperties.CRICITAL)
);
}
public float getCriticalForBattle_PrimaryGrade()
{
return this.getCritical();
}
public float getCriticalForBattle_NextGrade()
{
string gradeNew = "S";
if (this.curStar < 5)
{
gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality;
}
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.CRICITAL, level, gradeNew);
//return (int)(heroAr
// + getEquipExtraProperty(EHeroProperties.CRICITAL)
// + getYanlingExtraProperty(EHeroProperties.CRICITAL)
// );
}
public int getKangbaojiForBattle()
{
return (int)(getKangbaoji()
//+ getEquipExtraProperty(EHeroProperties.KANGBAOJI)//武器没有抗暴击
+ getYanlingExtraProperty(EHeroProperties.KANGBAOJI)
);
}
public float getKangbaojiForBattle_PrimaryGrade()
{
return this.getKangbaoji();
}
public float getKangbaojiForBattle_NextGrade()
{
string gradeNew = "S";
if (this.curStar < 5)
{
gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality;
}
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.KANGBAOJI, level, gradeNew);
//return (int)(heroAr
// + getYanlingExtraProperty(EHeroProperties.KANGBAOJI)
// );
}
public int getYanliForBattle()
{
return (int)(getYanli()
+ getEquipExtraProperty(EHeroProperties.YANLI)
+ getYanlingExtraProperty(EHeroProperties.YANLI)
);
}
public float getYanliForBattle_PrimaryGrade()
{
return this.getYanli();
}
public float getYanliForBattle_NextGrade()
{
string gradeNew = "S";
if (this.curStar < 5)
{
gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality;
}
return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.YANLI, level, gradeNew);
//return (int)(heroAr
// +getEquipExtraProperty(EHeroProperties.YANLI)
// + getYanlingExtraProperty(EHeroProperties.YANLI)
// );
}
///
/// 获取暴击率(战斗中使用)(2020.6.3)
///
///
public float getCriticalRatioInBattle()
{
return this.getCriticalForBattle() / (75 + level * 5);
}
#endregion
///
/// 获取唤灵师下所有言灵的属性信息
///
public Dictionary GetYanLingBaseAttr
{
get
{
Dictionary dic = new Dictionary();
if (this.yanling.Count <= 0)
{
return dic;
}
Dictionary items = UserProxy.Instance.player.collectYanling.items;
int hp = 0;
int crit = 0;
int phyAtk = 0;
int phyDef = 0;
int atkSpeed = 0;
int fashuqiangdu = 0;
int mofakangxing = 0;
foreach (KeyValuePair kv in this.yanling)
{
if (!items.ContainsKey(kv.Value.itemuid))
{
continue;
}
Dictionary baseAttr = items[kv.Value.itemuid].baseAttr;
if (baseAttr.ContainsKey(EHeroProperties.HP))
{
hp += baseAttr[EHeroProperties.HP];
}
if (baseAttr.ContainsKey(EHeroProperties.CRICITAL))
{
crit += baseAttr[EHeroProperties.CRICITAL];
}
if (baseAttr.ContainsKey(EHeroProperties.WULIGONGJI))
{
phyAtk += baseAttr[EHeroProperties.WULIGONGJI];
}
if (baseAttr.ContainsKey(EHeroProperties.FANGYUHUJIA))
{
phyDef += baseAttr[EHeroProperties.FANGYUHUJIA];
}
if (baseAttr.ContainsKey(EHeroProperties.ATKSPEED))
{
atkSpeed += baseAttr[EHeroProperties.ATKSPEED];
}
if (baseAttr.ContainsKey(EHeroProperties.FASHUQIANGDU))
{
fashuqiangdu += baseAttr[EHeroProperties.FASHUQIANGDU];
}
if (baseAttr.ContainsKey(EHeroProperties.MOFAKANGXING))
{
mofakangxing += baseAttr[EHeroProperties.MOFAKANGXING];
}
}
if (hp != 0)
{
dic[EHeroProperties.HP] = hp;
}
if (crit != 0)
{
dic[EHeroProperties.CRICITAL] = crit;
}
if (phyAtk != 0)
{
dic[EHeroProperties.WULIGONGJI] = phyAtk;
}
if (phyDef != 0)
{
dic[EHeroProperties.FANGYUHUJIA] = phyDef;
}
if (atkSpeed != 0)
{
dic[EHeroProperties.ATKSPEED] = atkSpeed;
}
if (fashuqiangdu != 0)
{
dic[EHeroProperties.FASHUQIANGDU] = fashuqiangdu;
}
if (mofakangxing != 0)
{
dic[EHeroProperties.MOFAKANGXING] = mofakangxing;
}
return dic;
}
}
///
/// 获取唤灵师下所有言灵的随机属性
///
public Dictionary GetYanLingRandAttr
{
get
{
Dictionary dic = new Dictionary();
if (this.yanling.Count <= 0)
{
return dic;
}
Dictionary items = UserProxy.Instance.player.collectYanling.items;
int hp = 0;
int manaUpperlimit = 0;
int phyDamage = 0;
int magDamage = 0;
int phyDefend = 0;
int magDefend = 0;
int phyDamagereduce = 0;
int magDamagereduce = 0;
int additional_monsterExp = 0;
int additional_atkSpeed = 0;
int additional_moveSpeed = 0;
int additional_critProbability = 0;
int additional_critDamage = 0;
int skillCoolTs = 0;
foreach (KeyValuePair kv in this.yanling)
{
if (!items.ContainsKey(kv.Value.itemuid))
{
continue;
}
Dictionary randAttr = items[kv.Value.itemuid].randAttr;
if (randAttr.ContainsKey(EHeroAddProperties.additional_hpUpperlimit))
{
hp += randAttr[EHeroAddProperties.additional_hpUpperlimit];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_manaUpperlimit))
{
manaUpperlimit += randAttr[EHeroAddProperties.additional_manaUpperlimit];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_phyDamage))
{
phyDamage += randAttr[EHeroAddProperties.additional_phyDamage];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_magDamage))
{
magDamage += randAttr[EHeroAddProperties.additional_magDamage];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_phyDefend))
{
phyDefend += randAttr[EHeroAddProperties.additional_phyDefend];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_magDefend))
{
magDefend += randAttr[EHeroAddProperties.additional_magDefend];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_phyDamagereduce))
{
phyDamagereduce += randAttr[EHeroAddProperties.additional_phyDamagereduce];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_magDamagereduce))
{
magDamagereduce += randAttr[EHeroAddProperties.additional_magDamagereduce];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_monsterExp))
{
additional_monsterExp += randAttr[EHeroAddProperties.additional_monsterExp];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_atkSpeed))
{
additional_atkSpeed += randAttr[EHeroAddProperties.additional_atkSpeed];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_moveSpeed))
{
additional_moveSpeed += randAttr[EHeroAddProperties.additional_moveSpeed];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_critProbability))
{
additional_critProbability += randAttr[EHeroAddProperties.additional_critProbability];
}
if (randAttr.ContainsKey(EHeroAddProperties.additional_critDamage))
{
additional_critDamage += randAttr[EHeroAddProperties.additional_critDamage];
}
if (randAttr.ContainsKey(EHeroAddProperties.skillCoolTs))
{
additional_critDamage += randAttr[EHeroAddProperties.skillCoolTs];
}
}
if (hp != 0)
{
dic[EHeroAddProperties.additional_hpUpperlimit] = hp;
}
if (manaUpperlimit != 0)
{
dic[EHeroAddProperties.additional_manaUpperlimit] = manaUpperlimit;
}
if (phyDamage != 0)
{
dic[EHeroAddProperties.additional_phyDamage] = phyDamage;
}
if (magDamage != 0)
{
dic[EHeroAddProperties.additional_magDamage] = magDamage;
}
if (phyDefend != 0)
{
dic[EHeroAddProperties.additional_phyDefend] = phyDefend;
}
if (magDefend != 0)
{
dic[EHeroAddProperties.additional_magDefend] = magDefend;
}
if (phyDamagereduce != 0)
{
dic[EHeroAddProperties.additional_phyDamagereduce] = phyDamagereduce;
}
if (magDamagereduce != 0)
{
dic[EHeroAddProperties.additional_magDamagereduce] = magDamagereduce;
}
if (additional_monsterExp != 0)
{
dic[EHeroAddProperties.additional_monsterExp] = additional_monsterExp;
}
if (additional_atkSpeed != 0)
{
dic[EHeroAddProperties.additional_atkSpeed] = additional_atkSpeed;
}
if (additional_moveSpeed != 0)
{
dic[EHeroAddProperties.additional_moveSpeed] = additional_moveSpeed;
}
if (additional_critProbability != 0)
{
dic[EHeroAddProperties.additional_critProbability] = additional_critProbability;
}
if (additional_critDamage != 0)
{
dic[EHeroAddProperties.additional_critDamage] = additional_critDamage;
}
if (skillCoolTs != 0)
{
dic[EHeroAddProperties.skillCoolTs] = skillCoolTs;
}
return dic;
}
}
public void ReloadData(GameHeroVo from)
{
var tp = typeof(GameHeroVo);
var pps = tp.GetProperties();
foreach (var p in pps)
{
if (p.CanWrite)
{
p.SetValue(this, p.GetValue(from));
}
}
}
#endregion
}
///
/// 英雄品阶枚举
///
public enum EHeroQuality
{
D = 1,
C = 2,
B = 3,
A = 4,
S = 5
}
///
/// 英雄属性
///
public enum EHeroProperties
{
///
/// 生命值
///
HP,
///
/// 能量值
///
NENGLIANGZHI,
///
/// 物理攻击
///
WULIGONGJI,
///
/// 防御护甲
///
FANGYUHUJIA,
///
/// 敏捷---废弃
///
GONGJISUDU,
///
/// 暴击
///
CRICITAL,
///
/// 法术强度
///
FASHUQIANGDU,
///
/// 魔法抗性
///
MOFAKANGXING,
///
///攻击速度--废弃
///
ATKSPEED,
///
/// 抗暴击
///
KANGBAOJI,
///
/// 言力
///
YANLI,
}
///
/// 随机属性
///
public enum EHeroAddProperties
{
///
/// 生命上限加成
///
additional_hpUpperlimit,
///
/// 言能上限加成
///
additional_manaUpperlimit,
///
/// 物攻伤害加成
///
additional_phyDamage,
///
/// 护甲加成
///
additional_phyDefend,
///
/// 敏捷
///
additional_moveSpeed,
///
/// 暴击伤害加成
///
additional_critDamage,
///
/// 言攻伤害加成
///
additional_magDamage,
///
/// 言抗加成
///
additional_magDefend,
///
/// 攻击速度加成
///
additional_atkSpeed,
///
/// 物伤减免加成
///
additional_phyDamagereduce,
///
/// 言伤减免加成
///
additional_magDamagereduce,
///
///怪物经验加成
///
additional_monsterExp,
///
/// 暴击几率加成
///
additional_critProbability,
///
/// 冷却时间
///
skillCoolTs,
}
public class PropertiesComparison : Singleton
{
public static Dictionary Comparison = new Dictionary
{
{ EHeroAddProperties.additional_hpUpperlimit,"生命上限"},
{ EHeroAddProperties.additional_manaUpperlimit,"言能上限"},
{ EHeroAddProperties.additional_phyDamage,"物攻伤害"},
{ EHeroAddProperties.additional_magDamage,"言攻伤害"},
{ EHeroAddProperties.additional_phyDefend,"护甲加成"},
{ EHeroAddProperties.additional_magDefend,"言抗加成"},
{ EHeroAddProperties.additional_phyDamagereduce,"物伤减免"},
{ EHeroAddProperties.additional_magDamagereduce,"言伤减免"},
{ EHeroAddProperties.additional_monsterExp,"经验加成"},
{ EHeroAddProperties.additional_atkSpeed,"攻击速度"},
{ EHeroAddProperties.additional_moveSpeed,"移动速度"},
{ EHeroAddProperties.additional_critProbability,"暴击几率"},
{ EHeroAddProperties.additional_critDamage,"暴击伤害"},
{ EHeroAddProperties.skillCoolTs,"冷却时间"},
};
}
///
/// 英雄的职业类别
///
public enum HeroZhiye
{
战士 = 1, //防
法师 = 2,
辅助 = 3, //辅
坦克 = 4, //突
刺客 = 5, //攻
}
///
/// 英雄的所属元素元素类型//0 空的//1 金 //2 冰 //3 火 //4 风 //5 雷 //6 毒 //7 黑暗 //8 亡灵 // 9 物理
///
public enum HeroYuansu
{
金系 = 1,
冰系 = 2,
火系 = 3,
风系 = 4,
雷系 = 5,
毒系 = 6,
黑暗系 = 7,
亡灵系 = 8,
物理系 = 9,
}
///
/// 英雄自身的装备数据
///
public class HeroGameVo_Equip
{
///
/// 装备的类型
///
public string equipType { get; set; }
///
/// 装备的物品UID
///
public string equipItemUID { get; set; }
///
/// 物品类型
///
public int typeId
{
get
{
var player = UserProxy.Instance.player;
var uid = int.Parse(this.equipItemUID);
if (player.collectEquip.equipments.ContainsKey(uid))
{
return int.Parse(player.collectEquip.equipments[uid].typeId);
}
return 0;
}
}
///
/// 物品等级
///
public int level { get; set; }
///
/// 获取装备的Mo(基础数据), 武器扩展数据请继续.GetWeaponExt();
///
///
public sm_item_base EquipMo()
{
return sm_item_base.GetMoById(this.typeId);
}
///
/// 把int隐式转换为HeroGameVo_Yanling对象
///
///
public static implicit operator HeroGameVo_Equip(int i)
{
return i > 0 ? new HeroGameVo_Equip() { equipItemUID = i.ToString() } : null;
}
///
/// 隐式转换为int值
///
///
public static implicit operator int(HeroGameVo_Equip o)
{
return int.Parse(o.equipItemUID);
}
}
///
/// 英雄自身的言灵数据
///
public class HeroGameVo_Yanling
{
///
/// 言灵的实例唯一ID
///
public int itemuid { get; set; }
///
/// 当前能量值
///
public int sp_now { get; set; }
///
/// 当前CD
///
public float cd_now { get; set; }
///
/// 物品类型
///
public int typeId;
//{
private int getTypeIdFromUID()
{
var player = UserProxy.Instance.player;
var uid = this.itemuid;
if (player.collectYanling.items.ContainsKey(uid))
{
return int.Parse(player.collectYanling.items[uid].typeId);
}
return 0;
}
//}
///
/// 获取言灵的Mo(基础数据), 获取扩展数据请继续.GetYanlingExt();
///
///
public sm_item_base Mo()
{
return sm_item_base.GetMoById(this.typeId);
}
///
/// 把int隐式转换为HeroGameVo_Yanling对象
///
///
public static implicit operator HeroGameVo_Yanling(int i)
{
if (i > 0)
{
var p = UserProxy.Instance.player;
var hvo = new HeroGameVo_Yanling() { itemuid = i };
hvo.typeId = hvo.getTypeIdFromUID();
return hvo;
}
return null;
}
///
/// 把int隐式转换为HeroGameVo_Yanling对象
///
///
public static implicit operator HeroGameVo_Yanling(long i)
{
if (i > 0)
{
var p = UserProxy.Instance.player;
var hvo = new HeroGameVo_Yanling() { itemuid = (int)i };
hvo.typeId = hvo.getTypeIdFromUID();
return hvo;
}
return null;
}
///
/// 隐式转换为int值
///
///
public static implicit operator int(HeroGameVo_Yanling o)
{
return o.itemuid;
}
}