Esempio n. 1
0
 public static void DoEquipRestoreBlood(GameClient client, int categoriy)
 {
     if (client.ClientData.CurrentLifeV <= 0)
     {
         GoodsData goodData = client.UsingEquipMgr.GetGoodsDataByCategoriy(client, categoriy);
         if (null != goodData)
         {
             List <MagicActionItem> magicActionItemList = UsingGoods.GetMagicActionListByGoodsID(goodData.GoodsID);
             if (magicActionItemList != null && magicActionItemList.Count > 0)
             {
                 MagicActionItem item = magicActionItemList[0];
                 if (MagicActionIDs.EXT_RESTORE_BLOOD == item.MagicActionID)
                 {
                     double cooldown = item.MagicActionParams[0];
                     if (cooldown * 1000.0 + (double)client.ClientData.SpecialEquipLastUseTicks < (double)TimeUtil.NOW())
                     {
                         client.ClientData.CurrentLifeV             = client.ClientData.LifeV;
                         client.ClientData.SpecialEquipLastUseTicks = TimeUtil.NOW();
                         GameManager.ClientMgr.NotifyImportantMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, GLang.GetLang(531, new object[0]), GameInfoTypeIndexes.Hot, ShowGameInfoTypes.ErrAndBox, 0);
                     }
                 }
             }
         }
     }
 }
Esempio n. 2
0
        public static bool IfProcessSeveralTimesAction(int goodsID, string toType)
        {
            List <MagicActionItem> magicActionItemList = UsingGoods.GetMagicActionListByGoodsID(goodsID);
            bool result;

            if (magicActionItemList == null)
            {
                result = false;
            }
            else
            {
                bool IsModifyYuanBao = false;
                for (int i = 0; i < magicActionItemList.Count; i++)
                {
                    MagicActionItem item = magicActionItemList[i];
                    if (item.MagicActionID <= MagicActionIDs.ActionSeveralTimesBegin || item.MagicActionID >= MagicActionIDs.ActionSeveralTimesEnd)
                    {
                        return(false);
                    }
                    if (item.MagicActionID == MagicActionIDs.ADD_DJ)
                    {
                        IsModifyYuanBao = true;
                    }
                }
                result = (!StringUtil.IsEqualIgnoreCase(toType, "UseYuanBao") || !IsModifyYuanBao);
            }
            return(result);
        }
Esempio n. 3
0
        /// <summary>
        /// 被攻击时吸收一部分伤害(护身戒指)
        /// </summary>
        /// <param name="client">客户端对象</param>
        /// <param name="categoriy">装备类型</param>
        /// <param name="injure">传入的伤害值</param>
        /// <returns>抵消的伤害值</returns>
        public static int DoSubInJure(GameClient client, int categoriy, int injure)
        {
            GoodsData goodData = client.UsingEquipMgr.GetGoodsDataByCategoriy(client, categoriy);

            if (null == goodData)
            {
                return(0);
            }

            // 获取指定物品的公式列表
            List <MagicActionItem> magicActionItemList = UsingGoods.GetMagicActionListByGoodsID(goodData.GoodsID);

            if (null == magicActionItemList || magicActionItemList.Count <= 0)
            {
                return(0);
            }

            int    subInjure        = 0;
            int    magicValue       = 0;
            double percent          = 0;
            double magicToBloodRate = 0;

            MagicActionItem item = magicActionItemList[0];

            if (MagicActionIDs.EXT_SUB_INJURE == item.MagicActionID)
            {
                percent          = item.MagicActionParams[0];
                magicToBloodRate = item.MagicActionParams[1];
            }
            else
            {
                return(0);
            }

            if (percent <= 0 || magicToBloodRate <= 0)
            {
                return(0);
            }

            percent = percent / 100.0;

            // 计算伤害的抵消量
            magicValue = client.ClientData.CurrentMagicV;
            subInjure  = (int)Math.Min(injure * percent, magicValue / magicToBloodRate);

            int oldMagicV = client.ClientData.CurrentMagicV;

            // 减去消耗的魔法值
            client.ClientData.CurrentMagicV -= (int)(magicToBloodRate * subInjure);

            return(Math.Min(subInjure, injure));
        }
Esempio n. 4
0
        /// <summary>
        /// 生命值为0时,立即回复100%生命值
        /// </summary>
        /// <param name="client">客户端对象</param>
        /// <param name="categoriy">装备类型</param>
        public static void DoEquipRestoreBlood(GameClient client, int categoriy)
        {
            if (client.ClientData.CurrentLifeV > 0)
            {
                return;
            }

            GoodsData goodData = client.UsingEquipMgr.GetGoodsDataByCategoriy(client, categoriy);

            if (null == goodData)
            {
                return;
            }

            // 获取指定物品的公式列表
            List <MagicActionItem> magicActionItemList = UsingGoods.GetMagicActionListByGoodsID(goodData.GoodsID);

            if (null == magicActionItemList || magicActionItemList.Count <= 0)
            {
                return;
            }

            double          cooldown = 0;
            MagicActionItem item     = magicActionItemList[0];

            if (MagicActionIDs.EXT_RESTORE_BLOOD == item.MagicActionID)
            {
                cooldown = item.MagicActionParams[0];
            }
            else
            {
                return;
            }

            //判断是否处于冷却中,如果是则退出
            if ((cooldown * 1000) + client.ClientData.SpecialEquipLastUseTicks >= TimeUtil.NOW())
            {
                return;
            }

            // 恢复全部生命值
            client.ClientData.CurrentLifeV = client.ClientData.LifeV;

            //设置冷却时间
            client.ClientData.SpecialEquipLastUseTicks = TimeUtil.NOW();

            //提示用户复活戒指状态生效
            GameManager.ClientMgr.NotifyImportantMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool,
                                                     client, Global.GetLang("复活戒指状态生效"), GameInfoTypeIndexes.Hot, ShowGameInfoTypes.ErrAndBox, 0);
        }
Esempio n. 5
0
        /// <summary>
        /// 解析公式字符串
        /// </summary>
        /// <param name="actions"></param>
        /// <returns></returns>
        private List <MagicActionItem> ParseActions(string actions)
        {
            List <MagicActionItem> itemsList = new List <MagicActionItem>();

            string[] actionFields = actions.Split('|');
            for (int j = 0; j < actionFields.Length; j++)
            {
                string          item            = actionFields[j].Trim();
                MagicActionItem magicActionItem = ParseParams(item);
                if (null != magicActionItem)
                {
                    itemsList.Add(magicActionItem);
                }
            }

            return(itemsList);
        }
Esempio n. 6
0
 public static void DoEquipExtAttack(GameClient client, int categoriy, int enemy)
 {
     if (-1 != enemy)
     {
         GoodsData goodData = client.UsingEquipMgr.GetGoodsDataByCategoriy(client, categoriy);
         if (null != goodData)
         {
             List <MagicActionItem> magicActionItemList = UsingGoods.GetMagicActionListByGoodsID(goodData.GoodsID);
             if (magicActionItemList != null && magicActionItemList.Count > 0)
             {
                 MagicActionItem item = magicActionItemList[0];
                 if (MagicActionIDs.EXT_ATTACK_MABI == item.MagicActionID)
                 {
                     double percent = item.MagicActionParams[0];
                     double time    = item.MagicActionParams[1];
                     if ((double)Global.GetRandomNumber(0, 101) <= percent)
                     {
                         int nOcc = Global.CalcOriginalOccupationID(client);
                         if (0 != nOcc)
                         {
                             percent *= 0.5;
                         }
                         if (-1 != enemy)
                         {
                             GSpriteTypes st = Global.GetSpriteType((uint)enemy);
                             if (st != GSpriteTypes.Monster)
                             {
                                 if (st == GSpriteTypes.Other)
                                 {
                                     GameClient enemyClient = GameManager.ClientMgr.FindClient(enemy);
                                     if (null != enemyClient)
                                     {
                                         enemyClient.ClientData.DongJieStart   = TimeUtil.NOW();
                                         enemyClient.ClientData.DongJieSeconds = (int)time;
                                         GameManager.ClientMgr.NotifyRoleStatusCmd(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, enemyClient, 2, enemyClient.ClientData.DongJieStart, enemyClient.ClientData.DongJieSeconds, 0.0);
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }
Esempio n. 7
0
        public static int DoSubInJure(GameClient client, int categoriy, int injure)
        {
            GoodsData goodData = client.UsingEquipMgr.GetGoodsDataByCategoriy(client, categoriy);
            int       result;

            if (null == goodData)
            {
                result = 0;
            }
            else
            {
                List <MagicActionItem> magicActionItemList = UsingGoods.GetMagicActionListByGoodsID(goodData.GoodsID);
                if (magicActionItemList == null || magicActionItemList.Count <= 0)
                {
                    result = 0;
                }
                else
                {
                    MagicActionItem item = magicActionItemList[0];
                    if (MagicActionIDs.EXT_SUB_INJURE == item.MagicActionID)
                    {
                        double percent          = item.MagicActionParams[0];
                        double magicToBloodRate = item.MagicActionParams[1];
                        if (percent <= 0.0 || magicToBloodRate <= 0.0)
                        {
                            result = 0;
                        }
                        else
                        {
                            percent /= 100.0;
                            int magicValue = client.ClientData.CurrentMagicV;
                            int subInjure  = (int)Math.Min((double)injure * percent, (double)magicValue / magicToBloodRate);
                            int oldMagicV  = client.ClientData.CurrentMagicV;
                            client.ClientData.CurrentMagicV -= (int)(magicToBloodRate * (double)subInjure);
                            result = Math.Min(subInjure, injure);
                        }
                    }
                    else
                    {
                        result = 0;
                    }
                }
            }
            return(result);
        }
Esempio n. 8
0
        private List <MagicActionItem> ParseActions(string actions)
        {
            List <MagicActionItem> itemsList = new List <MagicActionItem>();

            string[] actionFields = actions.Split(new char[]
            {
                '|'
            });
            for (int i = 0; i < actionFields.Length; i++)
            {
                string          item            = actionFields[i].Trim();
                MagicActionItem magicActionItem = this.ParseParams(item);
                if (null != magicActionItem)
                {
                    itemsList.Add(magicActionItem);
                }
            }
            return(itemsList);
        }
Esempio n. 9
0
        public static void ProcessFallBaoXiang_StepOne(GameClient client, SystemXmlItem systemGoodsItem, GoodsData goodsData, ref int UseNum)
        {
            List <MagicActionItem> magicActionItemList = null;

            if (GameManager.SystemMagicActionMgr.GoodsActionsDict.TryGetValue(goodsData.GoodsID, out magicActionItemList) && null != magicActionItemList)
            {
                if (magicActionItemList.Count > 0)
                {
                    MagicActionItem magicActionItem = magicActionItemList[0];
                    if (MagicActionIDs.FALL_BAOXIANG == magicActionItem.MagicActionID || MagicActionIDs.FALL_BAOXIANG_2 == magicActionItem.MagicActionID)
                    {
                        int fallID       = (int)magicActionItem.MagicActionParams[0];
                        int maxFallCount = (int)magicActionItem.MagicActionParams[1];
                        int _site        = 0;
                        if (MagicActionIDs.FALL_BAOXIANG_2 == magicActionItem.MagicActionID)
                        {
                            _site = (int)magicActionItem.MagicActionParams[2];
                        }
                        List <FallGoodsItem> gallGoodsItemList = GameManager.GoodsPackMgr.GetFallGoodsItemList(fallID);
                        if (null != gallGoodsItemList)
                        {
                            List <GoodsData> goodsDataList = new List <GoodsData>();
                            int useGoodsLoop;
                            for (useGoodsLoop = 0; useGoodsLoop < UseNum; useGoodsLoop++)
                            {
                                List <FallGoodsItem> tempItemList2 = GameManager.GoodsPackMgr.GetFallGoodsItemByPercent(gallGoodsItemList, maxFallCount, 1, 1.0);
                                if (tempItemList2.Count > 0)
                                {
                                    List <GoodsData> tempGoodsList = GameManager.GoodsPackMgr.GetGoodsDataListFromFallGoodsItemList(tempItemList2);
                                    if (null != tempGoodsList)
                                    {
                                        bool canUse = true;
                                        foreach (GoodsData item2 in tempGoodsList)
                                        {
                                            SystemXmlItem systemGoods = null;
                                            if (!GameManager.SystemGoods.SystemXmlItemDict.TryGetValue(item2.GoodsID, out systemGoods))
                                            {
                                                LogManager.WriteLog(LogTypes.Error, string.Format("掉落包配置出错 fallID={0} goodsID={1}", fallID, item2.GoodsID), null, true);
                                                canUse = false;
                                                break;
                                            }
                                            int categoriy = systemGoods.GetIntValue("Categoriy", -1);
                                            int site      = Global.GetSiteByCategoriy(categoriy);
                                            if (site != _site && _site != 15000)
                                            {
                                                LogManager.WriteLog(LogTypes.Error, string.Format("掉落包配置出错 fallID={0} goodsID={1}", fallID, item2.GoodsID), null, true);
                                                canUse = false;
                                                break;
                                            }
                                            item2.Site    = site;
                                            item2.Binding = goodsData.Binding;
                                        }
                                        if (!canUse)
                                        {
                                            break;
                                        }
                                        using (List <GoodsData> .Enumerator enumerator = tempGoodsList.GetEnumerator())
                                        {
                                            while (enumerator.MoveNext())
                                            {
                                                GoodsData item      = enumerator.Current;
                                                GoodsData findGoods = goodsDataList.Find((GoodsData x) => x.GoodsID == item.GoodsID && x.ExcellenceInfo == item.ExcellenceInfo && x.GCount + item.GCount <= Global.GetGoodsGridNumByID(x.GoodsID));
                                                if (null == findGoods)
                                                {
                                                    goodsDataList.Add(item);
                                                }
                                                else
                                                {
                                                    findGoods.GCount += item.GCount;
                                                }
                                            }
                                        }
                                        canUse = Global.CanAddGoodsNum(client, _site, goodsDataList.Count);
                                        if (!canUse)
                                        {
                                            using (List <GoodsData> .Enumerator enumerator = tempGoodsList.GetEnumerator())
                                            {
                                                while (enumerator.MoveNext())
                                                {
                                                    GoodsData item      = enumerator.Current;
                                                    GoodsData findGoods = goodsDataList.Find((GoodsData x) => x.GoodsID == item.GoodsID);
                                                    if (null != findGoods)
                                                    {
                                                        findGoods.GCount -= item.GCount;
                                                        if (findGoods.GCount <= 0)
                                                        {
                                                            goodsDataList.Remove(findGoods);
                                                        }
                                                    }
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                            UseNum = useGoodsLoop;
                            client.ClientData.FallBaoXiangGoodsList = goodsDataList;
                        }
                    }
                }
            }
        }
Esempio n. 10
0
        /// <summary>
        /// 攻击时附加的效果(麻痹戒指附加一定几率的麻痹效果)
        /// </summary>
        /// <param name="client">客户端对象</param>
        /// <param name="categoriy">装备类型</param>
        /// <param name="enemy">释放目标</param>
        public static void DoEquipExtAttack(GameClient client, int categoriy, int enemy)
        {
            if (-1 == enemy)
            {
                return;
            }

            double time    = 0;
            double percent = 0;

            GoodsData goodData = client.UsingEquipMgr.GetGoodsDataByCategoriy(client, categoriy);

            if (null == goodData)
            {
                return;
            }

            // 获取指定物品的公式列表
            List <MagicActionItem> magicActionItemList = UsingGoods.GetMagicActionListByGoodsID(goodData.GoodsID);

            if (null == magicActionItemList || magicActionItemList.Count <= 0)
            {
                return;
            }

            MagicActionItem item = magicActionItemList[0];

            if (MagicActionIDs.EXT_ATTACK_MABI == item.MagicActionID)
            {
                percent = item.MagicActionParams[0];
                time    = item.MagicActionParams[1];
            }
            else
            {
                return;
            }

            if (Global.GetRandomNumber(0, 101) > percent)
            {
                return;
            }

            // 属性改造 加上一级属性公式 区分职业[8/15/2013 LiaoWei]
            int nOcc = Global.CalcOriginalOccupationID(client);

            if (0 != nOcc)
            {
                percent = percent * 0.5;
            }

            //判断是否找到了敌人
            if (-1 != enemy)
            {
                //根据敌人ID判断对方是系统爆的怪还是其他玩家
                GSpriteTypes st = Global.GetSpriteType((UInt32)enemy);
                if (st == GSpriteTypes.Monster)
                {
                    /*Monster enemyMonster = GameManager.MonsterMgr.FindMonster(client.ClientData.MapCode, enemy);
                     * if (null != enemyMonster)
                     * {
                     * }*/
                }
                else if (st == GSpriteTypes.Other)
                {
                    GameClient enemyClient = GameManager.ClientMgr.FindClient(enemy);
                    if (null != enemyClient)
                    {
                        enemyClient.ClientData.DongJieStart   = TimeUtil.NOW();
                        enemyClient.ClientData.DongJieSeconds = (int)time;

                        //发送角色冻结状态命令
                        GameManager.ClientMgr.NotifyRoleStatusCmd(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, enemyClient,
                                                                  (int)RoleStatusIDs.DongJie, enemyClient.ClientData.DongJieStart, enemyClient.ClientData.DongJieSeconds);
                    }
                }
            }
        }
Esempio n. 11
0
        private MagicActionItem ParseParams(string item)
        {
            int    start = item.IndexOf('(');
            string name;
            string paramsList;

            if (-1 != start)
            {
                int end = item.IndexOf(')', start + 1);
                if (-1 == end)
                {
                    return(null);
                }
                name       = item.Substring(0, start);
                paramsList = item.Substring(start + 1, end - start - 1);
            }
            else if ((start = item.IndexOf(',')) != -1)
            {
                name       = item.Substring(0, start);
                paramsList = item.Substring(start + 1, item.Length - start - 1);
            }
            else
            {
                name       = item;
                paramsList = "";
            }
            int             id = this.FindIDByName(name);
            MagicActionItem result;

            if (id < 0)
            {
                result = null;
            }
            else
            {
                double[] actionParams = null;
                if (paramsList != "")
                {
                    string[] paramsArray = paramsList.Split(new char[]
                    {
                        ','
                    });
                    actionParams = new double[paramsArray.Length];
                    for (int i = 0; i < paramsArray.Length; i++)
                    {
                        if (char.IsDigit(paramsArray[i], 0) || paramsArray[i][0] == '-')
                        {
                            actionParams[i] = Global.SafeConvertToDouble(paramsArray[i]);
                        }
                        else
                        {
                            actionParams[i] = (double)this.FindIDByName(paramsArray[i]);
                        }
                    }
                }
                result = new MagicActionItem
                {
                    MagicActionID     = (MagicActionIDs)id,
                    MagicActionParams = actionParams
                };
            }
            return(result);
        }