Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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]);
                }
            }
        }
Example #4
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));
    }
Example #5
0
 public void Init(Net.PkgGoodsInfo equip)
 {
     Attrs       = new Attributes();
     BasicAttrs  = new ActorAttribute();
     LegendAttrs = new EquipAttributes();
     if (equip != null)
     {
         //处理LegendAttrs
     }
 }
Example #6
0
        /// <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)));
        }
Example #7
0
        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();
            }
        }
Example #8
0
        /// <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();
            }
        }
Example #10
0
        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();
            }
        }
Example #11
0
        // 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));
        }
Example #12
0
        /// <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);
        }
Example #13
0
        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();
            }
        }
Example #14
0
 public ActorDataBase(int entityId, int typeId) : base(entityId, typeId)
 {
     m_Attribute = new ActorAttribute();
 }
Example #15
0
        /// <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);
        }