LUACN论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: YJWOW MagicStone BoL
查看: 2049|回复: 6

[GC] 请教一个范围治疗判断条件的问题!

[复制链接]
发表于 2016-3-7 17:30:15 | 显示全部楼层 |阅读模式
游戏中有部分范围治疗法术是以团队中某个目标为施法目标(代号A)治疗该目标一定范围内**多个目标(代号B,C,D...)

GC中也有函数“判断指定目标附近范围内血量少于某值的队友数量”(具体记不太清,大概意思懂得),我们一般会在技能释放目标中使用自定义目标,设定血量小于等于一定数值(例如90%)的目标,那么函数会在该目标周围进行搜索符合条件的队友数量,然后释放技能。


那么问题来了!


我的理解是自定义目标中血量小于一定数值,应该是搜索的是少于这个数值的血量最低的目标,函数搜索该目标周围的队友信息是否符合条件


那么当A血量为50%,B,C,D各为80%,队友条件设置为目标附近10码范围内有大于等于2个目标血量小于等于80%则返回真,假如一定时间内A,B,C,D血量不发生变化,且A与B,C,D的距离都在10码以上,B,C,D三个都互相在10码以内。


请问函数是会继续判断等待A附近10码内出现2个血量小于80%的队友时才释放技能,还是忽略掉A,直接以B,C,D中的一个为目标释放技能?(B,C,D中任意一个目标为施法对象都满足条件函数的设定)
回复

使用道具 举报

发表于 2016-3-8 09:05:19 | 显示全部楼层
gc手头没有,我觉得可以自己做一个类似的,用着更加自由。可以给你提供一个思路:
这种团队刷血的,可以计算出每一个玩家u[j]附近少血玩家的总少血量,对附近范围内每一个玩家的少血量lesshp,技能可以加血的回复量hp,最后求出plus=min(lesshp,hp),对于u[j]求出这个plus的总和(对i求和)healvalue[j],求出healvalue[j]的最大值就是最佳目标距离估计下的施法目标了,过量也是最少的。时间复杂度大概是O(n2)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-8 14:10:31 | 显示全部楼层
龙套哥 发表于 2016-3-8 09:05
gc手头没有,我觉得可以自己做一个类似的,用着更加自由。可以给你提供一个思路:
这种团队刷血的,可以计 ...

GC用习惯了,比较方便快捷,希望能用AM函数增加一些功能。其实一直想弄一个治疗链的代码,但是AM函数里面好像没有范围判断。
思路是在40码范围内搜索A,在A12码范围内搜索B,在B12码范围内搜索C,AB,C都满足设定条件则对A释放治疗链。
代码这样写不知道行不行
local LZA = FHGetUnitsTables (3,40,"player")
local LZB = FHGetUnitsTables (3,12,LZA)
local LZC = FHGetUnitsTables (3,12,LZB)
if LZA and LZB and LZC
and aml(LZA,"%",0)<90 and aml(LZB,"%",0)<90 and aml(LZC,"%",0)<90
and not UnitIsDeadOrGhost(LZA) and not UnitIsDeadOrGhost(LZB) and not UnitIsDeadOrGhost(LZC)
and FHINSight(LZA) and amisr("治疗之涌",LZA) then
amrun("治疗链",LZA);
end
回复 支持 反对

使用道具 举报

发表于 2016-3-8 14:28:13 | 显示全部楼层
陈·风暴烈酒 发表于 2016-3-8 14:10
GC用习惯了,比较方便快捷,希望能用AM函数增加一些功能。其实一直想弄一个治疗链的代码,但是AM函数里面 ...

治疗链跳转是随机的还是跳最少?你这样写应该是同时初始化建立了三个表,估计会很卡。一般这种比较复杂的情况,还是自己调用团队框架raid..i这样的,队友可以避开调用ObjectManager,这样效率会高一点。没有必要用fh的那些函数,只用到fh的距离判定就行。你这样做只是一个返回的可能目标,相当于迭代了三次FHgetUnit,效率很堪忧。直接写循环吧。
local unit1
for i= 1, 找团队对有数量总和的api do
local teammate = raid..i;
if getDistance("player",teammate) <40 and 某血量条件1 then
  for j = i,找团队对有数量总和的api do
  local tm2 = raid..j;
  if getDistance("player",teammate) <40 and 某血量条件2 and UnitIsUnit(tm2,teammate) == false then
  for k = j, 找团队对有数量总和的api do
  local tm3 = raid..k;
  if getDistance("player",teammate) <40 and 某血量条件3 and UnitIsUnit(tm3,teammate) == false and UnitIsUnit(tm3,tm2) == false then
unit1 = teammate;
break;
end
end
end
end
最后对着unit1放治疗链就行了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-8 15:05:44 | 显示全部楼层
龙套哥 发表于 2016-3-8 14:28
治疗链跳转是随机的还是跳最少?你这样写应该是同时初始化建立了三个表,估计会很卡。一般这种比较复杂的 ...

治疗链是智能的,跳转范围内血量最低的,谢谢啦,我学习一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-8 17:40:23 | 显示全部楼层
龙套哥 发表于 2016-3-8 14:28
治疗链跳转是随机的还是跳最少?你这样写应该是同时初始化建立了三个表,估计会很卡。一般这种比较复杂的 ...

还是不太懂你这种代码的写法,我想利用现有AM函数,不知道行不行
local dy1 = amraidinf("aml(unit,'%')<90 and not UnitIsDeadOrGhost(unit) and FHINSight(unit) and getDistance('player',unit)<40")
local dy2 = amraidinf("aml(unit,'%')<90 and not UnitIsDeadOrGhost(unit) and getDistance(dy1,unit)<13")
local dy3 = amraidinf("aml(unit,'%')<90 and not UnitIsDeadOrGhost(unit) and getDistance(dy2,unit)<13")
if dy1 and dy2 and dy3 and UnitIsUnit(dy1,dy2) == false and UnitIsUnit(dy2,dy3) == false and UnitIsUnit(dy1,dy3) == false and
amisr("治疗链",dy1) then
amrun("治疗链",dy1);
end
回复 支持 反对

使用道具 举报

发表于 2016-3-9 11:01:51 | 显示全部楼层
陈·风暴烈酒 发表于 2016-3-8 17:40
还是不太懂你这种代码的写法,我想利用现有AM函数,不知道行不行
local dy1 = amraidinf("aml(unit,'%')

恩 类似这个 你可以试试看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

小黑屋|手机版|Archiver|LUACN论坛

GMT+8, 2024-5-5 11:37 PM , Processed in 0.043217 second(s), 25 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表