找回密码
 点一下
查看: 1624|回复: 3

求助:想尝试修改1个塔的AI

[复制链接]
发表于 2011-6-7 10:25:05 | 显示全部楼层 |阅读模式
求高手指点,不要现成的,想学习!
问题是:
小弟我对以下的塔AI脚本中出现的两种情况,想去掉(但能力有限,经过多种尝试均未成功)
1.去掉AI中,当小兵和英雄在塔下时,塔有可能会攻击英雄(也就是说,只有该英雄在塔下,附近有己方的小兵就一定不会被塔所攻击)
 楼主| 发表于 2011-6-7 10:25:44 | 显示全部楼层
[jass]
function KYKY takes unit pKw returns boolean
    if IsUnitType(pKw,UNIT_TYPE_STRUCTURE) and GetUnitAbilityLevel(pKw,'Adts')>0 then
        return true
    endif
    return false
endfunction

function KXKX takes unit pKw returns unit
    local string lf5=H2Tx(pKw)
    return GetUnit(lf5,"TowerAI|TowerTarget")
endfunction

function Trig_TowerAI_Conditions takes nothing returns boolean
    local unit lKw=GetAttacker()
    local unit lKZ
    if not(KYKY(lKw))then
        return false
    endif
    if(CVReturnUnit(lKw)!=null)then
        return false
    endif
    set lKZ=KXKX(lKw)
    if(lKZ==null)then
        return true
    endif
    if(GetUnitState(lKZ,UNIT_STATE_LIFE)<1)then
        return true
    endif
    if(IsUnitInRange(lKw,lKZ,GetUnitAcquireRange(lKw)))then
        return false
    endif
    return true
endfunction

function KyKy takes unit pKw,unit pFB returns nothing
    local string lf5=H2Tx(pKw)
    call SetHandle(lf5,"TowerAI|TowerTarget",pFB)
endfunction

function Trig_TowerAI_Actions takes nothing returns nothing
    local unit lKw=GetAttacker()
    local group lgg=CreateGroup()
    local unit luu
    local real lK1
    local real lK2=151.
    local unit lK3=null
    call GroupEnumUnitsInRange(lgg,GetUnitX(lKw),GetUnitY(lKw),GetUnitAcquireRange(lKw),null)
    loop
        set luu=FirstOfGroup(lgg)
        exitwhen luu==null
        call GroupRemoveUnit(lgg,luu)
        if IsUnitEnemy(luu,GetOwningPlayer(lKw))then
            set lK1=GetUnitState(luu,UNIT_STATE_LIFE)
            if lK1<lK2 and lK1>1 and GetUnitTypeId(luu)!='o00C'then
                set lK2=lK1
                set lK3=luu
            endif
        endif
    endloop
    call KyKy(lKw,lK3)
    if lK3!=null then
        call DisableTrigger(GetTriggeringTrigger())
        call IssueTargetOrderById(lKw,OrderId("attack"),lK3)
        if GetOwningPlayer(lKw)==udg_pA_DTAX_SEPlayers[0]then
            call SetUnitAnimation(lKw,"attack alternate")
        endif
        call EnableTrigger(GetTriggeringTrigger())
    endif
    call DestroyGroup(lgg)
endfunction

function StartTrigger_TowerAI takes nothing returns nothing
    set gg_trg_TowerAI=CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_TowerAI,EVENT_PLAYER_UNIT_ATTACKED)
    call TriggerAddCondition(gg_trg_TowerAI,Condition(function Trig_TowerAI_Conditions))
    call TriggerAddAction(gg_trg_TowerAI,function Trig_TowerAI_Actions)
endfunction

function InitTrig_TowerAI takes nothing returns nothing
endfunction
[/jass]
回复

使用道具 举报

 楼主| 发表于 2011-6-7 14:00:17 | 显示全部楼层
大致上是根据血量来判定范围内的攻击目标,于是我把这一段闭掉
[jass]
function Trig_TowerAI_Actions takes nothing returns nothing
    local unit lKw=GetAttacker()
    local group lgg=CreateGroup()
    local unit luu
    local real lK1
    local real lK2=151.
    local unit lK3=null
    call GroupEnumUnitsInRange(lgg,GetUnitX(lKw),GetUnitY(lKw),GetUnitAcquireRange(lKw),null)
    loop
        set luu=FirstOfGroup(lgg)
        exitwhen luu==null
        call GroupRemoveUnit(lgg,luu)
        if IsUnitEnemy(luu,GetOwningPlayer(lKw))then
            set lK1=GetUnitState(luu,UNIT_STATE_LIFE
            if lK1<lK2 and lK1>1 and GetUnitTypeId(luu)!='o00C'then
                set lK2=lK1
                set lK3=luu
            endif
        endif
    endloop
    call KyKy(lKw,lK3)
    if lK3!=null then
        call DisableTrigger(GetTriggeringTrigger())
        call IssueTargetOrderById(lKw,OrderId("attack"),lK3)
        if GetOwningPlayer(lKw)==udg_pA_DTAX_SEPlayers[0]then
            call SetUnitAnimation(lKw,"attack alternate")
        endif
        call EnableTrigger(GetTriggeringTrigger())
    endif
    call DestroyGroup(lgg)
endfunction
[/jass]



效果明显,可还是会出现偶尔的攻击英雄。。何解?
回复

使用道具 举报

发表于 2011-7-5 17:24:17 | 显示全部楼层
设置一个变量AttackUnit。
触发。
事件是任意单位发动攻击(具体翻译记不住了,那个可以S流的事件)
判断被攻击单位是否等于AttackUnit。
如果否,则:
判断被攻击的单位是否是一个英雄(这个判断用IF,而不是条件)
满足条件则选取可攻击范围内的敌对非英雄单位添加到一个单位组。
如果单位组的单位数量不为零,那么发布攻判断被攻击单位是否等于AttackUnit。击命令到此单位组的随机单位。
如果是,则重置timer到期时间。
IF结束
设置AttackUnit为被攻击单位。
新IF如果布尔值Bool为False,
则设置此Bool为True。
开启计时器Timer,到期事件是设置AttackUnit= null,设置Bool = False

大体思路如此。

就是发动攻击前比较是否为上次攻击单位。如果不是,则判断被攻击单位是否为英雄。如果是检测可攻击范围内是否有非英雄单位。如果有就攻击非英雄单位。
每次执行设置上次攻击单位为此次被攻击的单位。
XX秒后重置被攻击单位为没有单位。
每次攻击重置XX秒计时器,如果计时器未开启,则开启计时器
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 15:04 , Processed in 0.046924 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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