找回密码
 点一下
查看: 1748|回复: 9

郁闷啊,被动CD技能!!

[复制链接]
发表于 2010-12-27 16:01:20 | 显示全部楼层 |阅读模式
这是一个被致命攻击后能保持1血无敌3秒的触发代码。
为什么这么做?就为了让它是被动,而且有CD。
原理,技能模板重生,0秒发动。
通过动态注册单位生命变化为小于0且存活来判断发动了技能
然后做相应动作。
BUG:
偶尔会出现触发不动作,导致满血满魔。

寻求解决方案!

[jass]
function BuQuWuDi takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = GetUnit(H2I(t),0)
    local trigger tri = GetTrigger(H2I(t),1)
    call SetUnitInvulnerable( u, false )
    call FlushMission(H2I(t))
    call DestroyTimer(t)
    call TriggerRegisterUnitLifeEvent( tri, u, LESS_THAN, 0. )
    //call BJDebugMsg( "重注册" )
    set t = null
    set u = null
    set tri = null
endfunction

function BuQuFuHuo takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = GetUnit(H2I(t),0)
    if IsUnitType(u, UNIT_TYPE_DEAD) == false then
        //call BJDebugMsg( "设置不屈" )
        call SelectUnitForPlayerSingle( u, GetOwningPlayer(u))
        call TimerStart(t,3.0,false,function BuQuWuDi)
        call SetUnitHP(u,1)
        call SetUnitMP(u,GetReal(H2I(t),2))
    else
        call DestroyTrigger(GetTrigger(H2I(t),1))
        //call BJDebugMsg( "注销" )
        call FlushMission(H2I(t))
        call DestroyTimer(t)
        call SetUnitInvulnerable( u, false )
    endif
    set t = null
    set u = null
endfunction


function BuQu_Actions takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local timer t
    if IsUnitType(u, UNIT_TYPE_DEAD) == false then
        set t = CreateTimer()
        call SaveAgent(H2I(t),0,u)
        call SaveAgent(H2I(t),1,GetTriggeringTrigger())
        call SaveRea(H2I(t),2,GetUnitMP(u))
        call SetUnitInvulnerable( u, true )
        call TimerStart(t,0.1,false,function BuQuFuHuo)
        //call BJDebugMsg( "开始不屈" )
        set t = null
    endif
    set u  = null
    return false
endfunction

function Trig_BuQu_Conditions takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local trigger tri
    if GetUnitAbilityLevel(u,'A0HB') == 1 and GetLearnedSkill() == 'A0HB'  then
        //call Debug("学习注册")
        set tri = CreateTrigger()
        call TriggerRegisterUnitLifeEvent( tri, u, LESS_THAN, 0. )
        call TriggerAddCondition( tri, Condition( function BuQu_Actions ) )
        set tri = null
    endif
    set u = null
    return false
endfunction

function Trig_BuQufuhuo_Conditions takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local trigger tri
    if GetUnitAbilityLevel(u,'A0HB') >= 1 then
        //call Debug("复活注册")
        set tri = CreateTrigger()
        call TriggerRegisterUnitLifeEvent( tri, u, LESS_THAN, 0. )
        call TriggerAddCondition( tri, Condition( function BuQu_Actions ) )
        set tri = null
    endif
    set u = null
    return false
endfunction

function InitTrig_BuQu takes nothing returns nothing
    local trigger tri = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( tri, EVENT_PLAYER_HERO_SKILL )
    call TriggerAddCondition( tri, Condition( function Trig_BuQu_Conditions ) )
    set tri = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( tri, EVENT_PLAYER_HERO_REVIVE_FINISH )
    call TriggerAddCondition( tri, Condition( function Trig_BuQufuhuo_Conditions ) )
    set tri = null
endfunction
[/jass]
 楼主| 发表于 2010-12-27 16:02:23 | 显示全部楼层
个别自定义函数,应该能猜出来吧~
回复

使用道具 举报

发表于 2010-12-27 21:36:30 | 显示全部楼层
据说“单位类型=死亡”不好用

BuQu.w3x

20 KB, 下载次数: 12

回复

使用道具 举报

发表于 2010-12-27 22:21:25 | 显示全部楼层
删除被动技能,添加主动技能狂战士,命令单位使用狂战士。
嗯,应该没问题,处理的好的话……
回复

使用道具 举报

发表于 2010-12-28 14:30:10 | 显示全部楼层
魔兽的实数机制相当不精确,因此使用“生命变化为小于0”作为事件是很容易出现BUG的。
所以要么将其改为“生命变化为小于1”,要么用其他技能来制造CD(如“狂战士”),要么用“接受伤害”……
回复

使用道具 举报

发表于 2010-12-28 18:10:51 | 显示全部楼层
改为生命小于1也不对。楼主的代码问题在于,即使有重生技能,单位还是可能会有一段时间里变成死亡单位的。如果在这段时间里也触发了生命值变化事件,bug就出来了。

而且0.9血也是死不了的
回复

使用道具 举报

发表于 2010-12-28 18:27:55 | 显示全部楼层
0.4还是多少才挂,反正不超过0.5
回复

使用道具 举报

发表于 2010-12-29 12:26:20 | 显示全部楼层
http://bbs.islga.org/read.php?tid=2175#30419
据说这是能完美捕捉重生的演示
具体就不知道了
回复

使用道具 举报

 楼主| 发表于 2011-3-26 22:45:15 | 显示全部楼层
恩 actboy168 的演示用了不同的捕捉重生~
我放进地图测试一段时间看看。

感谢各位~感谢actboy168
回复

使用道具 举报

 楼主| 发表于 2011-3-26 23:50:19 | 显示全部楼层
今天晚上做了个蛋疼的测试
HP=0.405 英雄死亡
HP=0.405000000000000000000001 英雄不死亡
那么这个结论 就是HP小于等于0.405时候触发死亡事件
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-4 06:36 , Processed in 0.109868 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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