htt0528 发表于 2015-7-23 07:35:12

【教程】【GC六段】 我知道你们想要这个---AOE最优位置选取(测试测试)

本帖最后由 托托 于 2016-2-5 20:47 编辑

新鲜出炉 欢迎测试反馈问题 后续会维护

才做出1分钟,早上有事 先放出来大家试用下!!!

面对怪群,如何让AOE技能得到最大收益(A到最多的怪),就是这个函数的作用

算法:枚举两个点,确定过这两个点的两个圆的的圆心,循环N个点看有多少个点在这个圆里

时间复杂度:O(n^3)


使用方法:
1.用记事本打开Interface\AddOns\GC\wowamfunctions.lua

2.翻到最后另起一行

3.粘贴

4.MY_AUTOCastAOE(SpellName,RANGE,r)SpellName=技能名RANGE=技能施放距离 r=技能半径
   
如MY_AUTOCastAOE("圣光之锤",30,10)

function dis(x1,y1,x2,y2)
      return math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
end

function center(x1,y1,x2,y2,r,tar)
      local px,py;
      px=x1-x2;
      py=y1-y2;
      local midx,midy;
      midx=(x1+x2)/2.0;
      midy=(y1+y2)/2.0;
      local d=dis(midx,midy,x1,y1);
      local gao=math.sqrt(r*r-d*d);
      if (math.abs(py)<1e-8) then
                if (tar) then
                        return midx,midy+gao
                        
                else
                        return midx,midy-gao
                end
      else
                local jiao=math.atan(-px/py);
                if (tar) then
                        return midx+gao*math.cos(jiao),midy+gao*math.sin(jiao)
                else
                        return midx-gao*math.cos(jiao),midy-gao*math.sin(jiao)
                end
      end
end

function check(rx,ry,r,Table)
      local ans=0;
      for i=1,#Table do
      if (dis(rx,ry,Table.x,Table.y)<r+.001) then      ans=ans+1 end
      end
      return ans
end

function MY_GetAOEPosition(r,Table)
local ans=1;
local rex,rey;
for i=1,#Table do
      for j=i+1,#Table do
                if (dis(Table.x,Table.y,Table.x,Table.y)>r*2) then break end
                local rx,ry=center(Table.x,Table.y,Table.x,Table.y,r,true);
                local tt=check(rx,ry,r,Table);
                if (tt>ans) then ans=tt rex=rx rey=ry end
                if (ans>=#Table) then break end
      end
end
return rex,rey
end

function MY_AUTOCastAOE(SpellName,RANGE,r)
local PointTable={}
for i = 1, #FHenemiesTable do
      local thisUnit = FHenemiesTable.unit
      if FHObjectDistance("player",thisUnit)<RANGE then
      local x,y,_=ObjectPosition(thisUnit)
      table.insert(PointTable,{x=x,y=y})
      end
end
local _,_,_,_,_,_,spellID = GetSpellInfo(SpellName)
local X,Y,_=MY_GetAOEPosition(r,PointTable)
local _,_,Z=ObjectPosition("player")
if X~=nil and Y~=nil and Z~=nil and amSpellCooldown(spellID) == 0then
      CastSpellByName(SpellName,"player");
      if IsAoEPending() then
                ClickPosition(X,Y,Z,true);
                return true;
      end
end
return false;
end








黑猩猩 发表于 2015-7-23 10:33:26

你这个问题已经被发现了,目前最新版本115.3 ,在判断自身或者目标周围有多少怪的时候(FH功能),是不带模型的,所以当有很大模型的怪的时候(例如:AK),会出现无法正确判断的情况,一般性测试的时候,都是以木柱为测试目标,木柱的模型很小,这也就是这个函数目前错误的情况,这个已经被我提交给蛙大,已经测试成功。

丁丁 发表于 2015-7-23 13:31:21

赞 羡慕搞得懂LUA的 我看了就睡着…我也想学的…
小提问
可不可以限定判断目标的移动速度是≤30的,你懂的…圈一放就尼玛跑走了。
还有目标存活时间函数msGTTD? (get target time to die) 有的AOE是慢慢A的
可以过滤掉被玩家法术控制的吗?过滤掉身上有无敌免疫伤害的怪呢?破羊或者AOE都A到副本里无敌的adds上。。

htt0528 发表于 2015-7-23 14:38:32

丁丁 发表于 2015-7-23 13:31
赞 羡慕搞得懂LUA的 我看了就睡着…我也想学的…
小提问
可不可以限定判断目标的移动速度是≤30的,你懂 ...
额,目前这个部分不包含是否Aoe的判断,而是Aoe的一个动作,不过关于排除非战斗目标和防破控倒是可以加入,感谢的你建议

巨型青蛙 发表于 2015-7-23 08:07:15

楼主的钻研精神赞一个

gengxxx 发表于 2015-7-23 08:10:12

屌屌屌屌!!!!
强烈好评。推荐加精

白鼻子的黑猫 发表于 2015-7-23 08:14:22

貌似蛮强力的。

你看的见我么 发表于 2015-7-23 08:49:40

厉害~大清早的就写帖子,也是蛮拼的!五星好评~

强力老猫 发表于 2015-7-23 09:17:42

好棒:hug:!!

JuN...TMTT 发表于 2015-7-23 09:54:24

{:5_187:}牛逼啊,赞
页: [1] 2
查看完整版本: 【教程】【GC六段】 我知道你们想要这个---AOE最优位置选取(测试测试)