/// <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); }
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); }