/// <summary> /// 获取饰品 突破后的附魔属性 /// </summary> public static ActorAttribute GetBreakAppendAttr(GoodsDecorate decorate) { ActorAttribute ret = new ActorAttribute(); if (decorate == null) { return(ret); } DecoratePosInfo posInfo = ItemManager.Instance.DecoratePosInfos.Find( delegate(DecoratePosInfo _info) { return(_info.Pos == decorate.Pos); }); if (posInfo == null) { return(ret); } uint nextBreakLv = posInfo.BreakLv + 1; foreach (var attr in posInfo.AppendAttrs) { if (attr.IsOpen || attr.BreakLv == nextBreakLv) { ret.Add(attr.AttrId, (long)attr.Value); } } return(ret); }
/// <summary> /// 获取法宝助战属性(装备加成) /// </summary> public static ActorAttribute GetMagicAssistEquipsAddAttrs(uint magicId) { ActorAttribute ret = new ActorAttribute(); foreach (var kv in ItemManager.Instance.WearingMagicEquip) { var equip = kv.Value; if (equip.MagicId == magicId) { // 装备基础属性 foreach (var baseKv in equip.BasicAttrs) { ret.Add(baseKv.Key, baseKv.Value.Value); } // 装备强化属性 var strengthAttr = GetStrengthAttr(equip.StrengthLv, equip); foreach (var strengthKv in strengthAttr) { ret.Add(strengthKv.Key, strengthKv.Value.Value); } // 装备附加属性 foreach (var appendKv in equip.AppendAttrs) { ret.Add(appendKv.Id, appendKv.Values[0]); } } } return(ret); }
/// <summary> /// 计算器灵的属性加成 /// activeCount 激活的升华属性数量 /// </summary> public static void ComputeAttribute(GoodsGodEquip goods, uint activeCount, ActorAttribute attr) { if (attr == null || goods == null) { return; } foreach (var baseAttr in goods.BasicAttrs) { attr.Add(baseAttr.Value.Id, baseAttr.Value.Value); } for (var i = 0; i < goods.ExtraAttrs.Count; i++) { if (i >= activeCount) { break; } var extraAttr = goods.ExtraAttrs[i]; if (extraAttr.Id > 0) { attr.Add(extraAttr.Data.SubAttrId, extraAttr.Values[0]); } } }
/// <summary> /// 根据属性列表算出战力 /// </summary> /// <returns></returns> public static ulong CalBattlePowerByAttrs(ActorAttribute attr) { if (attr == null) { return(0); } float baseValue = 0; float additionValue = 0; float specialValue = 0; float fourValue = 0; foreach (KeyValuePair <uint, IActorAttribute> kv in attr) { uint attrId = kv.Value.Id; BattlePowerInfo battlePowerInfo = DBBattlePower.Instance.GetBattlePowerInfo(attrId); if (battlePowerInfo != null) { long attrVal = kv.Value.Value; uint battleType = battlePowerInfo.val.Key; float battleValue = battlePowerInfo.val.Value; switch (battleType) { case 1: // 基数 { baseValue += attrVal * battleValue; } break; case 2: // 加成 { additionValue += attrVal * battleValue; } break; case 3: // 特殊 { float specialAttr = (GameConstHelper.GetFloat("GAME_CF_SPEED1") * attrVal) / (GameConstHelper.GetFloat("GAME_CF_SPEED2") + attrVal) - GameConstHelper.GetFloat("GAME_CF_SPEED3"); specialValue += specialAttr * battleValue; } break; case 4: // 一比一加战力 { fourValue += attrVal * battleValue; } break; default: break; } } } return((ulong)(baseValue * (10000.0f + additionValue + specialValue) / 10000.0f + fourValue)); }
public void Init(Net.PkgGoodsInfo equip) { Attrs = new Attributes(); BasicAttrs = new ActorAttribute(); LegendAttrs = new EquipAttributes(); if (equip != null) { //处理LegendAttrs } }
/// <summary> /// Get an actor attribute (health, armor etc.) /// </summary> /// <typeparam name="T">int or float</typeparam> /// <param name="attribute">Attribute to get</param> /// <returns>Value of attribute</returns> /// // irc (??) public static T GetAttributeIRC <T>(ActorAttribute attribute) where T : struct { uint ret = GetAttribute((uint)attribute.offset | 0xFFFFF000); //if (!ret.IsValid()) //{ // return default(T); //} return(mem.ReadMemory <T>((IntPtr)(ret + 8))); }
static Func<string, object> GetActorFactory(ActorAttribute actor) { if (actor == null) actor = new ActorAttribute(); switch (actor.Placement) { case Placement.Random: return A0Factory.GetGrain; case Placement.PreferLocal: return A1Factory.GetGrain; case Placement.DistributeEvenly: return A2Factory.GetGrain; default: throw new ArgumentOutOfRangeException(); } }
/// <summary> /// 获取法宝助战基础属性 /// </summary> public static ActorAttribute GetMagicAssistBaseAtts(uint magicId) { ActorAttribute ret = new ActorAttribute(); var magicInfo = DBMagic.Instance.GetData(magicId); if (magicInfo == null) { return(ret); } foreach (var v in magicInfo.AssistAttrs) { ret.Add(v.attr_id, v.attr_num); } return(ret); }
static Func<string, object> GetActorFactory(ActorAttribute actor) { var factory = GrainFactory(); if (actor == null) actor = new ActorAttribute(); switch (actor.Placement) { case Placement.Random: return id => factory.GetGrain<IA0>(id);; case Placement.PreferLocal: return id => factory.GetGrain<IA1>(id);; case Placement.DistributeEvenly: return id => factory.GetGrain<IA2>(id);; default: throw new ArgumentOutOfRangeException(); } }
static Func <string, object> GetActorFactory(ActorAttribute actor) { if (actor == null) { actor = new ActorAttribute(); } switch (actor.Placement) { case Placement.Random: return(A0Factory.GetGrain); case Placement.PreferLocal: return(A1Factory.GetGrain); case Placement.DistributeEvenly: return(A2Factory.GetGrain); default: throw new ArgumentOutOfRangeException(); } }
// AU3 Owned's /// <param name="type">true = int, false = float</param> public static T GetAttributeAU3 <T>(uint guid, ActorAttribute attribute) where T : struct { Actor[] localActors = IterateLocalActors(); Actor actor = ActorByGUID(localActors, guid); uint count = GetAttributeCount(); uint currentOffset = Offsets.ActorAtrib_4; uint actorAtrib, data, atribData; const uint ATTIBUTE_COUNT = 825; for (int i = 0; i < count; i++) { actorAtrib = mem.ReadMemoryAsUint(currentOffset); if (actorAtrib == actor.F*G) { currentOffset = mem.ReadMemoryAsUint(currentOffset + 0x10); for (int u = 0; u < ATTIBUTE_COUNT; u++) { data = mem.ReadMemoryAsUint(currentOffset); currentOffset += 0x4; if (data != 0x0) { atribData = mem.ReadMemoryAsUint(data + 0x4); if (atribData.ToString("X").StartsWith("FFFFF")) // MUST BE WAY BETTER WAY TO TEST LIKE SHIFTING BYTES //if((atribData & 0xFFFFF000) == 0xFFFFF000) - Not sure i understand the comment, but looking at the code I think this might be what you are looking for? { if (atribData.ToString("X").EndsWith(attribute.offset.ToString("X"))) { return(mem.ReadMemory <T>((IntPtr)(data + 0x8))); } } } } } currentOffset = currentOffset + Offsets.ofs_ActorAtrib_StrucSize; } return(default(T)); }
/// <summary> /// 获取法宝装备强化属性 /// </summary> public static ActorAttribute GetStrengthAttr(uint strengthLv, GoodsMagicEquip equip) { ActorAttribute ret = new ActorAttribute(); uint lv = strengthLv; if (lv > equip.MaxStrengthLv) { lv = equip.MaxStrengthLv; } string key = string.Format("{0}_{1}", (uint)equip.PosId, lv); List <string> rec = DBManager.Instance.QuerySqliteField <string>(GlobalConfig.DBFile, "data_magic_goods_str", "csv_id", key, "str_attrs"); if (rec.Count == 0) { return(ret); } string raw = rec[0]; raw = raw.Replace(" ", ""); var matchs = Regex.Matches(raw, @"\{(\d+),(\d+)\}"); foreach (Match _match in matchs) { if (_match.Success) { uint attrId = (DBTextResource.ParseUI(_match.Groups[1].Value)); uint attrValue = DBTextResource.ParseUI(_match.Groups[2].Value); ret.Add(attrId, attrValue); } } return(ret); }
static Func <string, object> GetActorFactory(ActorAttribute actor) { var factory = GrainFactory(); if (actor == null) { actor = new ActorAttribute(); } switch (actor.Placement) { case Placement.Random: return(id => factory.GetGrain <IA0>(id));; case Placement.PreferLocal: return(id => factory.GetGrain <IA1>(id));; case Placement.DistributeEvenly: return(id => factory.GetGrain <IA2>(id));; default: throw new ArgumentOutOfRangeException(); } }
public ActorDataBase(int entityId, int typeId) : base(entityId, typeId) { m_Attribute = new ActorAttribute(); }
/// <summary> /// 获取玩家穿戴饰品总属性描述 /// </summary> public static List <DBDecorate.LegendAttrDescItem> GetPlayerDecorateSumAttrsDesc() { ActorAttribute baseAtrrs = new ActorAttribute(); EquipAttributes legendAttrs = new EquipAttributes(); foreach (var kv in ItemManager.Instance.WearingDecorate) { var decorate = kv.Value; if (!decorate.IsWeared) { continue; } // 基础属性 foreach (var baseKv in decorate.BasicAttrs) { baseAtrrs.Add(baseKv.Value.Id, baseKv.Value.Value); } // 强化属性 var strengthenAttr = GetStrengthAttr(decorate.StrengthLv, decorate); foreach (var strengthenKv in strengthenAttr) { baseAtrrs.Add(strengthenKv.Value.Id, strengthenKv.Value.Value); } // 附魔属性 var appendAttr = GetAppendAttr(decorate); foreach (var appendKv in appendAttr) { baseAtrrs.Add(appendKv.Value.Id, appendKv.Value.Value); } // 传奇属性 foreach (var baseKv in decorate.LegendAttrs) { var attrId = baseKv.Id; List <uint> values = new List <uint>(); foreach (var e in baseKv.Values) { values.Add(e); } legendAttrs.AddValue(attrId, values, true); } } // 套装属性 var suitAttrList = GetDecorateSuitAttrList(); foreach (var e in suitAttrList) { if (e.Count >= 2) { uint attrId = e[0]; uint value = e[1]; if (attrId == GameConst.AR_ATTACK_BASE) // 基础攻击 { // 最小攻击 var minAtk = baseAtrrs.GetAttr(GameConst.AR_MIN_ATTACK_BASE); if (null != minAtk) { baseAtrrs.Add(GameConst.AR_MIN_ATTACK_BASE, value); } // 最大攻击 var maxAtk = baseAtrrs.GetAttr(GameConst.AR_MAX_ATTACK_BASE); if (null != maxAtk) { baseAtrrs.Add(GameConst.AR_MAX_ATTACK_BASE, value); } ; if (null == minAtk && null == maxAtk) { baseAtrrs.Add(attrId, value); } } else { baseAtrrs.Add(attrId, value); } } } var ret = new List <DBDecorate.LegendAttrDescItem>(); var baseDescArray = EquipHelper.GetEquipBaseDesItemArray(baseAtrrs, true); foreach (var item in baseDescArray) { var descItem = new DBDecorate.LegendAttrDescItem(); descItem.Name = item.PropName; descItem.ValueStr = item.ValueStr; ret.Add(descItem); } foreach (var kv in legendAttrs) { var equipAttrData = EquipHelper.GetEquipAttrData(kv.Id); var attrList = GetSubAttrDescEx(equipAttrData, kv.Values.ToArray()); if (attrList.Count >= 2) { var descItem = new DBDecorate.LegendAttrDescItem(); descItem.Name = attrList[0]; descItem.ValueStr = attrList[1]; ret.Add(descItem); } } return(ret); }