找回密码
 点一下
查看: 1355|回复: 12

问个关于动态注册的问题

[复制链接]
发表于 2008-8-19 00:51:21 | 显示全部楼层 |阅读模式
为什么我在单位接受伤害中添加UnitDamageTarget他就给我跳出来了?
代码如下:
[codes=jass]
function Trig_AUcs_effect_Conditions takes nothing returns boolean
    if ((GetEventDamage() > 0.00) and (UnitHasBuffBJ(GetTriggerUnit(),'B001') == true)) then
        return true
    endif
    return false
endfunction

function Trig_AUcs_effect_Actions takes nothing returns nothing
    local location tp = GetUnitLoc(GetTriggerUnit())
    local unit u
    call CreateNUnitsAtLocFacingLocBJ( 1, 'h000', Player(PLAYER_NEUTRAL_PASSIVE), Location(0, 0), tp )
    set u = bj_lastCreatedUnit
    call UnitAddAbilityBJ( 'A008', u )
    call IssueTargetOrderById( u, 852095, GetTriggerUnit() )
    call UnitApplyTimedLifeBJ( 1.00, 'BTLF', u )
    call RemoveLocation(tp)
// 这行
    call UnitDamageTarget( GetEventDamageSource(), GetTriggerUnit(), ( I2R(GetHeroStatBJ(bj_HEROSTAT_INT, GetEventDamageSource(), true)) * 12.00 ), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_COLD, WEAPON_TYPE_WHOKNOWS )
    set tp = null
    set u = null
endfunction

function Trig_AUcs_start_G_A takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterUnitEvent( t,GetEnumUnit(), EVENT_UNIT_DAMAGED )
    call TriggerAddCondition( t, Condition( function Trig_AUcs_effect_Conditions ) )
    call TriggerAddAction( t, function Trig_AUcs_effect_Actions )
    set t = null
endfunction
[/codes]
发表于 2008-8-19 01:38:06 | 显示全部楼层
因为你引发了1个无限循环。
A受到来自B的伤害,则A伤害B。这样触发器会再次被触发。而A又会伤害B。如此循环往复。无休止地循环。

war3检测到了这个程序设计错误。善意地终止了程序。所以你的机器才没死机。

你这样:

call DisableTrigger( GetTriggeringTrigger())
call UnitDamageTarget( GetEventDamageSource(), GetTriggerUnit(), ( I2R(GetHeroStatBJ(bj_HEROSTAT_INT, GetEventDamageSource(), true)) * 12.00 ), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_COLD, WEAPON_TYPE_WHOKNOWS )
call EnableTrigger( GetTriggeringTrigger())

这样应该能解决你的问题。
回复

使用道具 举报

 楼主| 发表于 2008-8-19 01:58:49 | 显示全部楼层
刚才洗澡的时候突然想明白了,不过还是谢谢!
回复

使用道具 举报

 楼主| 发表于 2008-8-19 02:09:58 | 显示全部楼层
问题二:
由于这个动态注册函数其实套的是个ForGroupBJ,所以如果开关开关的话就会有单位无法注册,这怎么办?
回复

使用道具 举报

发表于 2008-8-19 12:25:12 | 显示全部楼层
套开关应该不会影响的
回复

使用道具 举报

发表于 2008-8-19 13:10:19 | 显示全部楼层
不同单位的触发器不同,所以依然有问题        用全局触发吧
回复

使用道具 举报

发表于 2008-8-19 13:11:44 | 显示全部楼层
貌似没必要用全局触发吧………………

最多是多做几个绑定而已
回复

使用道具 举报

发表于 2008-8-19 13:16:57 | 显示全部楼层
LS认为全局触发有什么坏处

我觉得应该这样说

貌似没必要多做几个绑定吧………………

最多是用全局触发而已
回复

使用道具 举报

发表于 2008-8-19 13:18:28 | 显示全部楼层
全局的效率较高,但对控制有些时候反而不方便,缓存绑定的效率虽然较低,但便于控制,便于操作
回复

使用道具 举报

 楼主| 发表于 2008-8-19 13:20:29 | 显示全部楼层
用全局触发不会引起重复注册吗?
回复

使用道具 举报

发表于 2008-8-19 13:29:09 | 显示全部楼层
就这段代码而言,即使不考虑到死循环的bug,为每个单位绑定一个触发也是下下之策。首先这段代码没有考虑到触发的删除,这个的泄漏是很恐怖的。即使考虑到了触发的删除,也会使地图多了上百个触发,效果也是和泄漏一样,效率就可想而知了
回复

使用道具 举报

发表于 2008-8-19 13:32:43 | 显示全部楼层
引用第9楼louter于2008-08-19 13:20发表的  :
用全局触发不会引起重复注册吗?


你的代码,能避免重复注册?


给单位绑定一个boolean,表明它已经注册过此触发
回复

使用道具 举报

 楼主| 发表于 2008-8-19 14:17:05 | 显示全部楼层
果然自己是jass小白一个。想想还是用个全局触发好了,虽然ms语句多了一点(其实没多多少)......
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-21 04:15 , Processed in 0.031981 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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