Esempio n. 1
0
        /// <summary>
        /// 检测目标是否在攻击范围内
        /// </summary>
        /// <param name="direction"></param>
        /// <returns></returns>
        private bool testAttackDistance(out int direction)
        {
            direction = 0;

            SystemXmlItem systemMagic = null;

            if (!GameManager.SystemMagicsMgr.SystemXmlItemDict.TryGetValue(skillId, out systemMagic))
            {
                return(false);
            }

            // 扫描类型 [11/27/2013 LiaoWei]
            List <MagicActionItem> magicScanTypeItemList = null;

            if (!GameManager.SystemMagicScanTypeMgr.MagicActionsDict.TryGetValue(skillId, out magicScanTypeItemList) || null == magicScanTypeItemList)
            {
                /*return false;*/
            }

            List <MagicActionItem> magicActionItemList = null;

            if (!GameManager.SystemMagicActionMgr.MagicActionsDict.TryGetValue(skillId, out magicActionItemList) || null == magicActionItemList)
            {
                return(false);
            }

            MagicActionItem magicScanTypeItem = null;

            if (null != magicScanTypeItemList && magicScanTypeItemList.Count > 0)
            {
                magicScanTypeItem = magicScanTypeItemList[0];
            }

            //技能施法距离
            int attackDistance = systemMagic.GetIntValue("AttackDistance");

            //如果是锁定目标单体攻击只校验技能施法距离
            if (systemMagic.GetIntValue("MagicType") == (int)EMagicType.EMT_Single || systemMagic.GetIntValue("MagicType") == (int)EMagicType.EMT_AutoTrigger) // 单体或自动触发
            {
                int targetType = systemMagic.GetIntValue("TargetType");                                                                                        // 技能目标类型

                if ((int)EMagicTargetType.EMTT_Self == targetType)                                                                                             //自身
                {
                    //判断距离
                    if (Global.GetTwoPointDistance(owner.CurrentPos, target.CurrentPos) > attackDistance)
                    {
                        return(false);;
                    }
                    else
                    {
                        return(true);
                    }
                }
                else if ((int)EMagicTargetType.EMTT_SelfAndTeam == targetType)
                {
                    return(false);
                }
            }
            else //群攻
            {
                Point targetPos;

                int attackDirection = 0;

                //首先根据配置文件算出目标中心点
                if ((int)EAttackTargetPos.EATP_Self == systemMagic.GetIntValue("TargetPos")) //自身
                {
                    targetPos = owner.CurrentPos;
                }
                else if ((int)EAttackTargetPos.EATP_TargetLock == systemMagic.GetIntValue("TargetPos")) //锁定目标
                {
                    targetPos = target.CurrentPos;

                    attackDirection = (int)Global.GetDirectionByTan((int)targetPos.X, (int)targetPos.Y, owner.CurrentPos.X, owner.CurrentPos.Y);
                }
                else //鼠标指向
                {
                    targetPos       = target.CurrentPos;
                    attackDirection = (int)Global.GetDirectionByTan((int)targetPos.X, (int)targetPos.Y, owner.CurrentPos.X, owner.CurrentPos.Y);
                }

                List <Object> enemiesObjList = new List <Object>();

                direction = attackDirection;

                if (magicScanTypeItem != null)
                {
                    //矩形范围技
                    if (magicScanTypeItem.MagicActionID == MagicActionIDs.SCAN_SQUARE)
                    {
                        GameManager.ClientMgr.LookupRolesInSquare(owner.CurrentMapCode, owner.CopyMapID, (int)owner.CurrentPos.X, (int)owner.CurrentPos.Y, (int)targetPos.X, (int)targetPos.Y, (int)magicScanTypeItem.MagicActionParams[0],
                                                                  (int)magicScanTypeItem.MagicActionParams[1], enemiesObjList);
                    }
                    else if (magicScanTypeItem.MagicActionID == MagicActionIDs.FRONT_SECTOR)
                    {
                        GameManager.ClientMgr.LookupEnemiesInCircleByAngle((int)attackDirection, owner.CurrentMapCode, owner.CopyMapID, (int)targetPos.X, (int)targetPos.Y, Global.SafeConvertToInt32(systemMagic.GetStringValue("AttackDistance")), enemiesObjList, magicScanTypeItem.MagicActionParams[0], true);
                    }
                    // 以前没有加对圆形的判断 导致竞技场ai无法释放群攻圆形的技能
                    else if (magicScanTypeItem.MagicActionID == MagicActionIDs.ROUNDSCAN) // 增加对圆形的判断 [XSea 2015/5/21]
                    {
                        GameManager.ClientMgr.LookupEnemiesInCircle(owner.CurrentMapCode, owner.CopyMapID, (int)owner.CurrentPos.X, (int)owner.CurrentPos.Y, (int)Global.SafeConvertToInt32(systemMagic.GetStringValue("AttackDistance")), enemiesObjList);
                    }
                }
                else
                {
                    GameManager.ClientMgr.LookupEnemiesInCircle(owner.CurrentMapCode, owner.CopyMapID, (int)targetPos.X, (int)targetPos.Y, Global.SafeConvertToInt32(systemMagic.GetStringValue("AttackDistance")), enemiesObjList);
                }

                if (enemiesObjList.Count <= 0)
                {
                    return(false);
                }

                for (int i = 0; i < enemiesObjList.Count; i++)
                {
                    if ((enemiesObjList[i] as GameClient).ClientData.RoleID == target.GetObjectID())
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Esempio n. 2
0
        private bool testAttackDistance(out int direction)
        {
            direction = 0;
            SystemXmlItem systemMagic = null;
            bool          result;

            if (!GameManager.SystemMagicsMgr.SystemXmlItemDict.TryGetValue(this.skillId, out systemMagic))
            {
                result = false;
            }
            else
            {
                List <MagicActionItem> magicScanTypeItemList = null;
                if (!GameManager.SystemMagicScanTypeMgr.MagicActionsDict.TryGetValue(this.skillId, out magicScanTypeItemList) || null == magicScanTypeItemList)
                {
                }
                List <MagicActionItem> magicActionItemList = null;
                if (!GameManager.SystemMagicActionMgr.MagicActionsDict.TryGetValue(this.skillId, out magicActionItemList) || null == magicActionItemList)
                {
                    result = false;
                }
                else
                {
                    MagicActionItem magicScanTypeItem = null;
                    if (magicScanTypeItemList != null && magicScanTypeItemList.Count > 0)
                    {
                        magicScanTypeItem = magicScanTypeItemList[0];
                    }
                    int attackDistance = systemMagic.GetIntValue("AttackDistance", -1);
                    if (systemMagic.GetIntValue("MagicType", -1) == 1 || systemMagic.GetIntValue("MagicType", -1) == 3)
                    {
                        int targetType = systemMagic.GetIntValue("TargetType", -1);
                        if (1 == targetType)
                        {
                            return(true);
                        }
                        if (this.skillId == 11004 && 4 == targetType)
                        {
                            return(true);
                        }
                        if (2 == targetType)
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        int   attackDirection = 0;
                        Point targetPos;
                        if (1 == systemMagic.GetIntValue("TargetPos", -1))
                        {
                            targetPos = this.owner.CurrentPos;
                        }
                        else if (2 == systemMagic.GetIntValue("TargetPos", -1))
                        {
                            targetPos       = this.target.CurrentPos;
                            attackDirection = (int)Global.GetDirectionByTan((double)((int)targetPos.X), (double)((int)targetPos.Y), this.owner.CurrentPos.X, this.owner.CurrentPos.Y);
                        }
                        else
                        {
                            targetPos       = this.target.CurrentPos;
                            attackDirection = (int)Global.GetDirectionByTan((double)((int)targetPos.X), (double)((int)targetPos.Y), this.owner.CurrentPos.X, this.owner.CurrentPos.Y);
                        }
                        List <object> enemiesObjList = new List <object>();
                        direction = attackDirection;
                        if (magicScanTypeItem != null)
                        {
                            if (magicScanTypeItem.MagicActionID == MagicActionIDs.SCAN_SQUARE)
                            {
                                GameManager.ClientMgr.LookupRolesInSquare(this.owner.CurrentMapCode, this.owner.CopyMapID, (int)this.owner.CurrentPos.X, (int)this.owner.CurrentPos.Y, (int)targetPos.X, (int)targetPos.Y, (int)magicScanTypeItem.MagicActionParams[0], (int)magicScanTypeItem.MagicActionParams[1], enemiesObjList);
                            }
                            else if (magicScanTypeItem.MagicActionID == MagicActionIDs.FRONT_SECTOR)
                            {
                                GameManager.ClientMgr.LookupEnemiesInCircleByAngle(attackDirection, this.owner.CurrentMapCode, this.owner.CopyMapID, (int)targetPos.X, (int)targetPos.Y, Global.SafeConvertToInt32(systemMagic.GetStringValue("AttackDistance")), enemiesObjList, magicScanTypeItem.MagicActionParams[0], true);
                            }
                            else if (magicScanTypeItem.MagicActionID == MagicActionIDs.ROUNDSCAN)
                            {
                                GameManager.ClientMgr.LookupEnemiesInCircle(this.owner.CurrentMapCode, this.owner.CopyMapID, (int)this.owner.CurrentPos.X, (int)this.owner.CurrentPos.Y, Global.SafeConvertToInt32(systemMagic.GetStringValue("AttackDistance")), enemiesObjList);
                            }
                        }
                        else
                        {
                            GameManager.ClientMgr.LookupEnemiesInCircle(this.owner.CurrentMapCode, this.owner.CopyMapID, (int)targetPos.X, (int)targetPos.Y, Global.SafeConvertToInt32(systemMagic.GetStringValue("AttackDistance")), enemiesObjList);
                        }
                        if (enemiesObjList.Count <= 0)
                        {
                            return(false);
                        }
                        for (int i = 0; i < enemiesObjList.Count; i++)
                        {
                            if ((enemiesObjList[i] as GameClient).ClientData.RoleID == this.target.GetObjectID())
                            {
                                return(true);
                            }
                        }
                    }
                    result = false;
                }
            }
            return(result);
        }