永恒的灌水帝吧 关注:587贴子:1,695
  • 19回复贴,共1

简单的派生技能和同步技能函数

只看楼主收藏回复

1.派生技能函数用于快速制作类似于瑞文Q,盲僧W,九尾和泽拉斯R这样的技能
2.同步技能函数用于简化形如“学习A技能则获得B技能,升级A则B也升级”的技能组合,并支持1个技能可同步多个技能


IP属地:广东1楼2013-08-01 10:14回复
    globals
    hashtable miHash = InitHashtable()//哈希表
    boolean bSyncSkill = false //通用英雄同步技能触发
    boolean bExtraSkill= false //通用英雄派生技能触发
    endglobals function mitFlashSkill takes nothing returns nothing
    local integer k = GetHandleId(GetExpiredTimer())
    local unit u = LoadUnitHandle(miHash,k,1)
    local integer si = LoadInteger(miHash,k,2)
    local integer n = LoadInteger(miHash,k,3)
    call UnitRemoveAbility(u,si)
    call UnitAddAbility(u,si)
    call SetUnitAbilityLevel(u,si,n)
    call DestroyTimer(GetExpiredTimer())
    endfunction function miFlashSkill2 takes unit u,integer si returns nothing
    local timer t = CreateTimer()
    local integer k = GetHandleId(t)
    call SaveUnitHandle(miHash,k,1,u)
    call SaveInteger(miHash,k,2,si)
    call SaveInteger(miHash,k,3,GetUnitAbilityLevel(u,si))
    call TimerStart(t,0,false,function mitFlashSkill)
    set t = null
    endfunction
    function miFlashSkill takes unit u,integer si returns nothing
    local integer i = GetUnitAbilityLevel(u,si)
    call UnitRemoveAbility(u,si)
    call UnitAddAbility(u,si)
    call SetUnitAbilityLevel(u,si,i)
    endfunction function miSS takes unit u,integer si1,integer si2 returns nothing
    if GetUnitAbilityLevel(u,si1)==1 then
    call UnitAddAbility(u,si2)
    else
    call SetUnitAbilityLevel(u,si2,GetUnitAbilityLevel(u,si1))
    endif
    endfunction function mitExtraSkill takes nothing returns nothing
    local integer k = GetHandleId(GetExpiredTimer())
    local unit u = LoadUnitHandle(miHash,k,1)
    local player p = GetOwningPlayer(u)
    local integer si1 = LoadInteger(miHash,k,2)
    local integer si2 = LoadInteger(miHash,k,3)
    call SaveInteger(miHash,si1,2,0)
    call SetPlayerAbilityAvailable( p, si2, false )
    call SetPlayerAbilityAvailable( p, si1, true )
    set u = null
    set p = null
    call DestroyTimer(GetExpiredTimer())
    endfunction function micExtraSkill2 takes unit u,integer si1,integer si2 returns nothing
    local timer t = CreateTimer()
    local integer k = GetHandleId(t)
    call SaveUnitHandle(miHash,k,1,u)
    call SaveInteger(miHash,k,2,si1)
    call SaveInteger(miHash,k,3,si2)
    call TimerStart(t,LoadReal(miHash,si1,5),false,function mitExtraSkill)
    set t = null
    endfunction function micExtraSkill takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local integer si1 = GetSpellAbilityId()
    local integer si2 = LoadInteger(miHash,si1,1)
    local integer n
    if si2!= 0 then
    if LoadBoolean(miHash,si1,4) == true then
    call miFlashSkill(u,si2)
    call SetUnitAbilityLevel(u,si2,GetUnitAbilityLevel(u,si1))
    call SetPlayerAbilityAvailable( GetOwningPlayer(u), si1, false )
    call SetPlayerAbilityAvailable( GetOwningPlayer(u), si2, true )
    call micExtraSkill2(u,si1,si2)
    else
    set n = LoadInteger(miHash,si2,2)+1
    if n >= LoadInteger(miHash,si2,3) then
    call SetPlayerAbilityAvailable( GetOwningPlayer(u), si1, false )
    call SetPlayerAbilityAvailable( GetOwningPlayer(u), si2, true )
    call SaveInteger(miHash,si2,2,0)
    else
    call miFlashSkill2(u,si1)
    call SaveInteger(miHash,si2,2,n)
    endif
    endif
    endif
    set u =null
    endfunction
    function mitrExtraSkill takes nothing returns nothing
    local trigger tr = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( tr, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition(tr, Condition(function micExtraSkill))
    set tr = null
    endfunction
    function miExtraSkill takes integer si1,integer si2,integer qex,real time returns nothing
    if bExtraSkill==false then
    set bExtraSkill = true
    call mitrExtraSkill()
    endif
    call SaveInteger(miHash,si1,1,si2)
    call SaveInteger(miHash,si2,1,si1)
    call SaveBoolean(miHash,si1,4,true)
    call SaveReal(miHash,si1,5,time)
    call SaveInteger(miHash,si1,3,qex)
    endfunction
    function micSyncSkill takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local integer si1 = GetLearnedSkill()
    local integer si2
    local integer i = LoadInteger(miHash,si1,9)
    loop
    exitwhen i < 1
    set si2 = LoadInteger(miHash,si1,10+i)
    call miSS(u,si1,si2)
    call UnitAddAbility(u,'AIs1')
    call UnitRemoveAbility(u,'AIs1')
    set i = i - 1
    endloop
    set u = null
    endfunction
    function mitrSyncSkill2 takes nothing returns nothing
    local trigger tr = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( tr, EVENT_PLAYER_HERO_SKILL )
    call TriggerAddCondition( tr, Condition(function micSyncSkill))
    set tr = null
    endfunction
    function miSyncSkill takes integer si1,integer si2 returns nothing
    local integer n = LoadInteger(miHash,si1,9)+1
    if bSyncSkill==false then
    set bSyncSkill = true
    call mitrSyncSkill2()
    endif
    call SaveInteger(miHash,si1,9 ,n)
    call SaveInteger(miHash,si1,10+n,si2)
    endfunction


    IP属地:广东2楼2013-08-01 10:15
    回复
      2025-08-09 12:25:58
      广告
      不感兴趣
      开通SVIP免广告
      使用方法:将上面代码复制到地图自定义代码区,然后在你想注册派生技能的地方调用函数,可以在地图初始化的时候调用

      函数格式
      派生技能为
      call miExtraSkill('原技能ID','派生技能ID',派生技能施放次数,派生技能存在时间)
      同步技能的格式为
      call miSyncSkill('原技能ID','同步ID')
      派生技能存在时间,就是派生技能不用的话会在几秒内自动消失,一般取3


      IP属地:广东3楼2013-08-01 10:19
      回复
        ‘’派生技能‘’是什么


        IP属地:北京来自Android客户端4楼2013-08-01 22:55
        收起回复
          很实用的说~


          IP属地:江苏来自Android客户端6楼2013-08-02 09:21
          回复
            @najizhimo


            来自手机贴吧7楼2013-08-02 09:41
            回复
              竟然有人发帖
                                                 ————为了朋友和明天


              IP属地:广东通过贴图神器上传8楼2013-08-02 09:45
              回复
                好东西


                IP属地:浙江9楼2013-08-18 22:08
                回复
                  2025-08-09 12:19:58
                  广告
                  不感兴趣
                  开通SVIP免广告
                  @najizhimo 我复制了居然挂了,测试不了图……以前可以的……


                  IP属地:江苏10楼2013-08-22 23:56
                  收起回复
                    mark


                    IP属地:上海来自手机贴吧11楼2013-09-09 11:00
                    回复
                      最后一个函数local integer n = LoadInteger(miHash,si1,9)+1 这一句是精髓啊,领教了!!!
                      不过我有个地方弄不清楚,倒数第三个函数micSyncSkill里这两句有什么意义?
                      call UnitAddAbility(u,'AIs1')
                      call UnitRemoveAbility(u,'AIs1')
                      'AIs1'查了好久才发现是力量+1的物品技能,不知放在这里有什么用?求大神赐教!


                      12楼2013-10-17 23:20
                      收起回复
                        很久没看到你了 上学很忙吧?


                        13楼2013-10-21 09:15
                        回复
                          楼主的源码不错啊,我拿走改造成VJ毒害新人去


                          IP属地:江苏14楼2014-01-14 18:14
                          回复
                            回一帖


                            IP属地:浙江来自Android客户端15楼2014-01-19 16:55
                            回复