找回密码
 点一下
查看: 2245|回复: 6

关于多个触发同时注册

[复制链接]
发表于 2007-12-2 20:07:50 | 显示全部楼层 |阅读模式
我在做那个连击的系统,不知道为什么只用普通攻击的时候很好,当加入技能时就乱套了
表现为:只有普通攻击:一切正常,别人的攻击也不会计入连击数
        普通+技能:别人的攻击也算进连击数了
[codes=jass]
function H2I takes handle h  returns integer
    return h
    return 0
endfunction

function I2TM takes integer i  returns timer
    return i
    return null
endfunction

function I2U takes integer i  returns unit
    return i
    return null
endfunction

function I2TG takes integer i  returns trigger
    return i
    return null
endfunction

function I2TC takes integer i  returns triggercondition
    return i
    return null
endfunction

function I2TA takes integer i  returns triggeraction
    return i
    return null
endfunction

function I2TAG takes integer i  returns texttag
    return i
    return null
endfunction

//************************************************

function ClearNum takes nothing returns nothing
    local timer tm=GetExpiredTimer()
    local unit hero=I2U(GetStoredInteger(udg_GC,I2S(H2I(tm)),"Hero"))
    call StoreReal(udg_GC,I2S(H2I(hero)),"ComboNum",0)
    call DestroyTimer(tm)
    set tm=null
    set hero=null
endfunction

function Show_Con takes nothing returns boolean
    local trigger trg=GetTriggeringTrigger()
    local unit hero=I2U(GetStoredInteger(udg_GC,I2S(H2I(trg)),"Hero"))
    local texttag tag=I2TAG(GetStoredInteger(udg_GC,I2S(H2I(hero)),"TextTag"))
    local timer tm=I2TM(GetStoredInteger(udg_GC,I2S(H2I(hero)),"Timer"))
    local unit target=I2U(GetStoredInteger(udg_GC,I2S(H2I(hero)),"Target"))
    local real n= GetStoredReal(udg_GC,I2S(H2I(hero)),"ComboNum")
    if hero==GetAttacker() then
        call DestroyTimer(tm)
        set tm=CreateTimer()
        call TimerStart(tm,3,false,function ClearNum)
        if (n==0 or target!=GetAttackedUnitBJ()) then
            set n=1
            call StoreReal(udg_GC,I2S(H2I(hero)),"Damage",0)//用于最后统计分数
        else
            set n=n+1
            if n>3 then
                call DestroyTextTag(tag)
                set tag=CreateTextTagUnitBJ( ( I2S(R2I(n)) + "击!" ), hero, 0,(10+n/10), 100, 0.00, 0.00, 0 )
                call SetTextTagVelocityBJ( GetLastCreatedTextTag(), 24, 90 )
                call SetTextTagPermanent( GetLastCreatedTextTag(), false )
                call SetTextTagLifespan( GetLastCreatedTextTag(), 3.00 )
                call SetTextTagFadepoint( GetLastCreatedTextTag(), 2.60 )
            endif
        endif
    else
        set trg=null
        set hero=null
        set target=null
        set tm=null
        set tag=null
        return false
    endif
    call StoreInteger(udg_GC,I2S(H2I(trg)),"Hero",H2I(hero))
    call StoreInteger(udg_GC,I2S(H2I(tm)),"Hero",H2I(hero))
    call StoreReal(udg_GC,I2S(H2I(hero)),"ComboNum",n)
    call StoreInteger(udg_GC,I2S(H2I(hero)),"TextTag",H2I(tag))
    call StoreInteger(udg_GC,I2S(H2I(hero)),"Target",H2I(GetAttackedUnitBJ()))
    call StoreInteger(udg_GC,I2S(H2I(hero)),"Timer",H2I(tm))
    set trg=null
    set hero=null
    set target=null
    set tm=null
    set tag=null
    return false
endfunction


function Show1_Con takes nothing returns boolean
    local trigger trg=GetTriggeringTrigger()
    local unit hero=I2U(GetStoredInteger(udg_GC,I2S(H2I(trg)),"Hero"))
    local texttag tag=I2TAG(GetStoredInteger(udg_GC,I2S(H2I(hero)),"TextTag"))
    local timer tm=I2TM(GetStoredInteger(udg_GC,I2S(H2I(hero)),"Timer"))
    local unit target=I2U(GetStoredInteger(udg_GC,I2S(H2I(hero)),"Target"))
    local real n= GetStoredReal(udg_GC,I2S(H2I(hero)),"ComboNum")
    call DestroyTimer(tm)
    set tm=CreateTimer()
    call TimerStart(tm,3,false,function ClearNum)
    if n==0 or (target!=GetSpellTargetUnit() and GetSpellTargetUnit()!=null) then
        set n=1
        call StoreReal(udg_GC,I2S(H2I(hero)),"Damage",0)//用于最后统计分数
    else
        set n=n+1
        if n>3 then
            call DestroyTextTag(tag)
            set tag=CreateTextTagUnitBJ( ( I2S(R2I(n)) + "击!" ), hero, 0,(10+n/10), 100, 0.00, 0.00, 0 )
            call SetTextTagVelocityBJ( GetLastCreatedTextTag(), 24, 90 )
            call SetTextTagPermanent( GetLastCreatedTextTag(), false )
            call SetTextTagLifespan( GetLastCreatedTextTag(), 3.00 )
            call SetTextTagFadepoint( GetLastCreatedTextTag(), 2.60 )
        endif
    endif
    if GetSpellTargetUnit()!=null then
        call StoreInteger(udg_GC,I2S(H2I(hero)),"Target",H2I(GetSpellTargetUnit()))
    endif
    call StoreInteger(udg_GC,I2S(H2I(trg)),"Hero",H2I(hero))
    call StoreInteger(udg_GC,I2S(H2I(tm)),"Hero",H2I(hero))
    call StoreReal(udg_GC,I2S(H2I(hero)),"ComboNum",n)
    call StoreInteger(udg_GC,I2S(H2I(hero)),"TextTag",H2I(tag))
    call StoreInteger(udg_GC,I2S(H2I(hero)),"Timer",H2I(tm))
    set trg=null
    set hero=null
    set target=null
    set tm=null
    set tag=null
    return false
endfunction

function Show takes unit hero returns nothing
    local trigger trg=CreateTrigger()
    local trigger trg1=CreateTrigger()
    //call StoreInteger(udg_GC,I2S(H2I(hero)),"Trigger",H2I(trg))
    call StoreReal(udg_GC,I2S(H2I(hero)),"ComboNum",0)
    call StoreInteger(udg_GC,I2S(H2I(trg)),"Hero",H2I(hero))
    call TriggerRegisterAnyUnitEventBJ(trg,EVENT_PLAYER_UNIT_ATTACKED)
    call StoreInteger(udg_GC,I2S(H2I(trg)),"TriggerCondition",H2I(TriggerAddCondition(trg,Condition(function Show_Con))))
    call StoreInteger(udg_GC,I2S(H2I(trg1)),"Hero",H2I(hero))
    call TriggerRegisterUnitEvent(trg1,hero,EVENT_UNIT_SPELL_EFFECT)
    call StoreInteger(udg_GC,I2S(H2I(trg1)),"TriggerCondition",H2I(TriggerAddCondition(trg,Condition(function Show1_Con))))
    set trg1=null
    set trg=null
endfunction

[/codes]

其中:trg为普通攻击计数;trg1为技能计数
 楼主| 发表于 2007-12-2 23:11:15 | 显示全部楼层
发现把 trg 和 trg1 分开用2个函数来触发,一切都好了,why???
回复

使用道具 举报

发表于 2007-12-5 13:12:14 | 显示全部楼层
没分开之前你用什么事件来注册的?
回复

使用道具 举报

发表于 2007-12-5 13:13:28 | 显示全部楼层
如果你用两个事件来注册同一个触发,他们之间是or的关系,就是任何一个事件发生都会触发动作,而且是两次。
回复

使用道具 举报

 楼主| 发表于 2007-12-6 09:25:04 | 显示全部楼层
没分开前就是我贴的那样啊,trg ,trg1不是2个触发么?
分开就是2个函数:show, show1
回复

使用道具 举报

发表于 2007-12-6 18:02:40 | 显示全部楼层
不知道为什么分开了就可以了,从程序上看我觉得即使分开了问题应该也会存在:
问题出在这里,任何一个单位被攻击都会被触发

call TriggerRegisterAnyUnitEventBJ(trg,EVENT_PLAYER_UNIT_ATTACKED)
然后:

call StoreInteger(udg_GC,I2S(H2I(trg)),"Hero",H2I(hero))

你把英雄绑到一个任意单位都能触发的“触发器”上,又在

Show_Con

读出来。

因为不知道你的 function Show 用在哪里,所以不知道具体的情况。至少从你贴出来的内容看是一定会出错的。
回复

使用道具 举报

 楼主| 发表于 2007-12-7 18:03:46 | 显示全部楼层
恩,最后改成为单位注册被攻击事件了
不过技能还没想好:(
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 20:34 , Processed in 0.034497 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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