Browse Source

MMO-20174: 召唤物可攻击自己的敌人

meijun 3 years ago
parent
commit
1913ce3461

+ 2 - 2
XmdsCommonServer/Plugin/Units/XmdsInstancePet.cs

@@ -394,7 +394,7 @@ namespace XmdsCommonServer.Plugin.Units
         /// 攻击自身敌人(距离最近).
         /// </summary>
         /// <returns></returns>
-        private bool TryAtkSelfEnemy()
+        protected virtual bool TryAtkSelfEnemy()
         {
             bool ret = false;
 
@@ -460,7 +460,7 @@ namespace XmdsCommonServer.Plugin.Units
         /// <param name="target"></param>
         /// <param name="skillrange"></param>
         /// <returns></returns>
-        private bool CheckInAtkRange(InstanceUnit target, float skillrange)
+        protected bool CheckInAtkRange(InstanceUnit target, float skillrange)
         {
             bool ret = false;
 

+ 52 - 2
XmdsCommonServer/Plugin/Units/XmdsInstanceSummonUnit.cs

@@ -1,6 +1,7 @@
 using CommonAI.Zone;
+using CommonAI.Zone.Helper;
 using CommonAI.Zone.Instance;
-
+using CommonLang;
 
 namespace XmdsCommonServer.Plugin.Units
 {
@@ -78,7 +79,56 @@ namespace XmdsCommonServer.Plugin.Units
 
             base.Disposing();
         }
-    }
+
+		protected override bool TryAtkSelfEnemy()
+		{
+			bool ret = false;
+			using (var list = ListObjectPool<InstanceUnit>.AllocAutoRelease())
+			{
+				//找到离自己最近的单位攻击.
+				Parent.getObjectsRoundRange<InstanceUnit>(Collider.Object_BlockBody_TouchRound, X, Y, Info.GuardRange, list, AoiStatus);
+				DoAndRemoveCollection.UpdateAndRemove<InstanceUnit>(list, (InstanceUnit u) =>
+				{
+					return !u.IsActive;
+				});
+
+				if (list != null && list.Count > 0)
+				{
+					list.Sort((a, b) =>
+					{
+						//选距离最近的单位.
+						float da = CMath.getDistanceSquare(a.X, a.Y, this.X, this.Y);
+						float db = CMath.getDistanceSquare(b.X, b.Y, this.X, this.Y);
+						return (int)(da - db);
+					});
+
+					foreach (SkillState skill in SkillStatus)
+					{
+						if (skill.LaunchSkill.AutoLaunch && skill.TryLaunch())
+						{
+							foreach (InstanceUnit u in list)
+							{
+								if (this.IsCanAttack(u) && Parent.IsAttackable(this, u, skill.Data.ExpectTarget, AttackReason.Attack, skill.Data))
+								{
+									//是否在守卫范围内.
+									if (CheckInAtkRange(u, this.Info.GuardRange + skill.Data.AttackRange))
+									{
+										//检测是否有可释放技能//
+										if (tryAutoLaunch(skill, u))
+										{
+											return true;
+										}
+									}
+								}
+							}
+						}
+					}
+
+				}
+			}
+			return ret;
+		}
+	}
 
 
 }