找回密码
 点一下
查看: 3061|回复: 10

动态注册的问题

[复制链接]
发表于 2008-9-20 11:32:03 | 显示全部楼层 |阅读模式
function Dmg takes nothing returns nothing
    call DestroyTrigger(GetTriggeringTrigger())
    if ( UnitHasBuffBJ(GetTriggerUnit(), 'BPSE') == true ) then
    call UnitDamageTarget( GetEventDamageSource(), GetTriggerUnit(), 150.00, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
    call UnitRemoveBuffBJ( 'BPSE', GetTriggerUnit() )
    endif
endfunction

function RegisterUnitAmortEvent takes unit tarUnit returns nothing
    local trigger tHam = CreateTrigger()                                           
    call TriggerRegisterUnitEvent( tHam , tarUnit, EVENT_UNIT_DAMAGED )
    call TriggerAddAction( tHam, function Dmg )
endfunction

=======================================================
注册触发器

function Trig_Green_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'AHtb' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Green_Actions takes nothing returns nothing
    call RegisterUnitAmortEvent(GetSpellTargetUnit())
endfunction

//===========================================================================
function InitTrig_Green takes nothing returns nothing
    set gg_trg_Green = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Green, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Green, Condition( function Trig_Green_Conditions ) )
    call TriggerAddAction( gg_trg_Green, function Trig_Green_Actions )
endfunction

BPSE是BUFF效果名,这个本来是想做成弹道法术命中目标才造成伤害,但是结果发生了一个问题,就是如果不停的施放这个法术,那么会注册好多次事件,然后第一个投射物打到的时候就把后面所有的投射物的伤害全部打上去了……
请问有什么处理办法,刚刚学习不久,不甚懂
发表于 2008-9-20 11:42:20 | 显示全部楼层
呃,要么就禁止这种情况的发生,要么就用全局伤害系统吧
回复

使用道具 举报

 楼主| 发表于 2008-9-20 11:59:30 | 显示全部楼层
回复

使用道具 举报

发表于 2008-9-20 13:31:57 | 显示全部楼层
LZ想要做出什么效果
让我看看有没有必要 非要用 动态注册
回复

使用道具 举报

发表于 2008-9-20 14:05:16 | 显示全部楼层
没必要动态注册,用1个全局触发就可以了。
回复

使用道具 举报

 楼主| 发表于 2008-9-20 16:48:17 | 显示全部楼层
貌似的确是没有必要……
回复

使用道具 举报

发表于 2008-9-21 10:18:14 | 显示全部楼层
LZ 会用缓存吗?会用的话很好解决阿
你在创建触发器的时候同时用缓存把创建的那个触发器保存起来,在下次施放技能的时候把上次的触发器删除,就可以了。
[jass]
  local trigger tHam  = CreateTrigger()
    local trigger tg
    set tg = I2T(GetStoredInteger(udg_GC,"Trigger",I2S(H2I(tarUnit))))
   call DestroyTrigger(tg)
    call StoreInteger(udg_GC,"Trigger",I2S(H2I(tarUnit)) ,H2I(tHam))                                    
    call TriggerRegisterUnitEvent( tHam , tarUnit, EVENT_UNIT_DAMAGED )
    call TriggerAddAction( tHam, function Dmg )
[/jass]

udg_GC是缓存变量
然后利用return BUG 将触发器邦定在目标单位身上,下次施放风暴之锤(看你的技能ID貌似是这个技能吧~。~)的时候,就会先把上次创建的触发器先删除,在将这次创建的触发器邦定到目标单位身上。这样就可以避免你说的问题了
回复

使用道具 举报

发表于 2008-9-21 15:45:17 | 显示全部楼层
如楼上所说的话,同时放两个技能,却只会有一个技能效果
回复

使用道具 举报

发表于 2008-9-21 16:07:11 | 显示全部楼层
回LS,如果在call RegisterUnitAmortEvent(GetSpellTargetUnit()) 的时候把 触发单位也传递过去,
然后将缓存中的 tarUnit改为触发单位的变量,多人同时施放就不会只出现一个效果了。(失误,LZ没说是否多人施放。。。。)
回复

使用道具 举报

发表于 2008-9-21 16:26:51 | 显示全部楼层
楼主说的是同一施法单位,对同一目标放锤子,第一个锤子还在空中飞的时候,就放第二个。
那么如6楼那样做的话,第二个锤子放的时候会把第一个锤子的触发删除,然后第一个锤子到达后就没捕捉的触发了,第二个锤子不会生效
回复

使用道具 举报

发表于 2008-9-21 17:09:38 | 显示全部楼层
那只有用马甲来施放锤子,然后捕捉伤害来源了?或者模拟一个飞行的锤子~ 至少我只想出了这两种~LX补充~.~
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 00:42 , Processed in 0.127470 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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