dota吧 关注:4,646,547贴子:155,327,239

回复:诈尸钓鱼帖:龟速直播翻新光环指南

取消只看楼主收藏回复

不稳定电流
A1E6/1093748022
code:AUau 邪恶光环
BuffID:B03X/1110455128
这个J涉及的函数貌似如果从源头看的话多得惊人
function M8I takes trigger t,playerunitevent M9I returns nothing
local integer VXI=0
loop
call TriggerRegisterPlayerUnitEvent(t,Player(VXI),M9I,Condition(function M7I))
set VXI=VXI+1
exitwhen VXI==16
endloop
endfunction
function M7I takes nothing returns boolean
return true
endfunction
这两个函数的作用是给触发器注册任意单位事件。在触发器里单位事件分任意单位事件(其实也就是所有玩家的单位事件都注册一遍),指定玩家单位事件和指定单位事件。
function Z91 takes nothing returns nothing
local trigger t=CreateTrigger()
call M8I(t,EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(t,Condition(function DU4))
set t=null
endfunction
function DU4 takes nothing returns boolean
if GetLearnedSkill()==1093748022 and GetUnitAbilityLevel(GetTriggerUnit(),1093748022)==1 and IsUnitIllusion(GetTriggerUnit())==false then
call DQ4()
endif
return false
endfunction
注册一个任意单位学习技能事件,条件为非幻象学习1级不稳定电流的触发器
function DQ4 takes nothing returns nothing
local unit JTI=GetTriggerUnit()
local trigger t=CreateTrigger()
local integer XII=GetHandleId(t)
call M8I(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function DP4))
call SaveUnitHandle(HY,(XII),(2),(JTI))
set JTI=null
set t=null
endfunction
function DP4 takes nothing returns boolean
local trigger t=GetTriggeringTrigger()
local integer XII=GetHandleId(t)
local unit JTI=(LoadUnitHandle(HY,(XII),(2)))
local integer YRI
if GetSpellTargetUnit()==JTI and DS4(GetSpellAbilityId())==true and IsUnitAlly(GetTriggerUnit(),GetOwningPlayer(JTI))==false and IsUnitType(GetTriggerUnit(),UNIT_TYPE_HERO)==true then
set YRI=GetUnitAbilityLevel(JTI,1093748022)
call DR4(JTI,JTI,GetTriggerUnit(),YRI)
endif
set t=null
set JTI=null
return false
endfunction
function DR4 takes unit YPI,unit JTI,unit JRI,integer YRI returns nothing
local unit P4I=CreateUnit(GetOwningPlayer(YPI),1697656901,GetUnitX(JTI),GetUnitY(JTI),0)
call MLI(P4I,1093747019)
call SetUnitAbilityLevel(P4I,1093747019,YRI)
call IssueTargetOrder(P4I,"chainlightning",JRI)
call MLI(P4I,1093744708)
call SetUnitAbilityLevel(P4I,1093744708,YRI)
call IssueTargetOrder(P4I,"purge",JRI)
set P4I=null
endfunction
function MLI takes unit X9I,integer MMI returns nothing
call UnitAddAbility(X9I,MMI)
call UnitMakeAbilityPermanent(X9I,true,MMI)
endfunction
注册一个触发器。任意单位发动技能效果事件;条件为施法目标为之前学习技能的单位、施法者不是同盟或单位所有者、施法者是英雄;动作是创造一个傀儡单位添加闪电链、净化技能并设置永久性,设置技能等级,对触发单位(即施法者)发布闪电链、净化命令。



IP属地:山东32楼2012-07-05 23:49
回复
    我擦,没想到一个看起来这么简单的技能IF用了这么多函数这就是运行效率高的原因吗?


    IP属地:山东33楼2012-07-05 23:51
    回复
      2025-08-10 18:16:48
      广告
      不感兴趣
      开通SVIP免广告
      25楼遗留问题的解释:
      function JSI takes unit JTI,unit JRI,integer JPI,real JQI returns nothing
      if JPI==0 then
      return
      endif
      if JPI==1 then
      call UnitDamageTarget(JTI,JRI,JQI,true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_FIRE,WEAPON_TYPE_WHOKNOWS)
      elseif JPI==2 then
      call UnitDamageTarget(JTI,JRI,JQI,true,true,ATTACK_TYPE_HERO,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
      elseif JPI==3 then
      call UnitDamageTarget(JTI,JRI,JQI,true,true,ATTACK_TYPE_HERO,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS)
      elseif JPI==4 then
      call UnitDamageTarget(JTI,JRI,JQI,true,true,ATTACK_TYPE_PIERCE,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
      elseif JPI==5 then
      call UnitDamageTarget(JTI,JRI,JQI,true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
      endif
      endfunction
      其实3、1、2也就是英雄攻击魔法伤害、普通攻击火焰伤害和英雄攻击普通伤害,对魔免、虚无都有伤害,而且高护甲、高魔抗也可以有足够的致死伤害。


      IP属地:山东34楼2012-07-05 23:54
      收起回复
        另外得补一下NEC竭心光环的前置函数,之前忽略了
        function FP1 takes nothing returns nothing
        local trigger t=CreateTrigger()
        call M8I(t,EVENT_PLAYER_HERO_SKILL)
        call TriggerAddCondition(t,Condition(function OL4))
        set t=null
        endfunction
        function OL4 takes nothing returns boolean
        if GetLearnedSkill()==1093677390 and IsUnitIllusion(GetTriggerUnit())==false and GetUnitAbilityLevel(GetTriggerUnit(),1093677390)==1 then
        call OK4()
        endif
        return false
        endfunction
        看过M8I函数的解释的童鞋应该知道了这其实就是注册了个任意单位学习技能的触发
        另外其实FP1也并不是真正的发端,有兴趣的可以接着向上搜索会看到真正的起始函数,大概也就一二百行吧
        


        IP属地:山东37楼2012-07-06 09:36
        回复
          神行太保
          A0ES 1093682515
          code:AUau 邪恶光环
          擦,一开始就误入歧途了不知道IF出于什么蛋疼目的,竟然在一个长的令人发指的函数里加上了技能ID不是神行太保的判断,可混蛋触发器的事件明明是发动技能效果啊,被动技能你给我发动技能效果啊
          


          IP属地:山东38楼2012-07-06 10:04
          回复
            为了方便起见先把技能的SLK数据全列出来算了
            夜晚中的狩猎者
            S00A 1395667009
            code:AOae 耐久光环
            buffID:B02L 1110454860
            900范围,仅对自己有效
            瘟疫
            A15K 1093743947
            code:AOae 耐久光环
            buffID:B0AI
            air,enemies,ground,her0,invulnerable,vulnerable 空中地面,敌人,英雄,无敌的,可攻击的
            野性驱使
            A03E
            AOae 耐久光环
            player,self 玩家单位,自己 Roshan Aura(名字没汉化,就是肉山光环)
            A142
            AHad专注光环
            buffID:B0A9
            最后遗言
            A0MC
            AOae 耐久光环
            air,enemies,ground,her0,invulnerable,vulnerable
            buffID:B05V
            施虐之心
            A060
            AHab辉煌光环
            self
            buffID:B02R
            精气光环
            A0IF
            AOae 耐久光环
            air,friend,ground,her0,invulnerable,self,vulnerable
            buffID:B06X
            并列
            A0DB
            AHab辉煌光环
            self
            buffID:B03B
            地精的贪婪
            A0O3
            AHab辉煌光环
            self
            buffID:B00X
            反击
            A00V
            AEah荆棘光环
            self
            buffID:B00M
            反击螺旋
            A0C6
            AHab辉煌光环(数值是0.01~)
            buffID: B03P
            风行者
            A14I
            集中火力
            A1D6
            寒冰之墙
            A0VP
            幽灵漫步
            A0XL
            黑洞
            A0BY
            跳跃
            A0LN
            追踪术
            A0B4
            织网
            A0BG
            极度饥渴
            A0WQ
            暗影之舞
            A1IN
            幽鬼之刃
            A0HW
            幽灵船
            A11K
            长大!
            A0CY
            神之力量
            A1WH
            酸性喷雾
            A0IL
            战意
            A0FV
            焦土
            A1OP
            嗥叫
            A0ZF
            变狼
            A093
            腐烂
            A06K
            剩下的就基本都是看J了。既然现在没人看,就到此为止了


            IP属地:山东41楼2012-07-06 11:18
            回复
              夜晚中的狩猎者(学习)
              A086 1093679158
              code:ANcl 通魔
              夜晚中的狩猎者(真技能)
              1395667009
              code:AOae 耐久光环
              buffID:B02L 1110454860
              900范围,仅对自己有效
              S00A
              以下函数对暗夜魔王的3个技能都有影响
              function B94 takes nothing returns nothing
              local integer XII=GetHandleId(GetTriggerUnit())
              local trigger t
              if((LoadBoolean(HY,(XII),(306)))==false)then
              call SaveBoolean(HY,(XII),(306),(true))
              set t=CreateTrigger()
              call TriggerRegisterTimerEventPeriodic(t,2.00)
              call TriggerRegisterGameStateEventTimeOfDay(t,LESS_THAN,6.00)
              call TriggerRegisterGameStateEventTimeOfDay(t,GREATER_THAN,18.00)
              call TriggerAddAction(t,function B84)
              call SaveUnitHandle(HY,(GetHandleId(t)),(304),(GetTriggerUnit()))
              set t=CreateTrigger()
              set XII=GetHandleId(t)
              call TriggerRegisterTimerEvent(t,0.5,true)
              call TriggerAddCondition(t,Condition(function B54))
              call SaveUnitHandle(HY,(XII),(304),(GetTriggerUnit()))
              call SaveUnitHandle(HY,(XII),(305),(CreateUnit(GetOwningPlayer(GetTriggerUnit()),1865429313,GetUnitX(GetTriggerUnit()),GetUnitY(GetTriggerUnit()),0)))
              endif
              if(GetLearnedSkill()==1093679158)then
              call MLI(GetTriggerUnit(),1395667009)
              if(KBI())then
              call SetUnitAbilityLevel(GetTriggerUnit(),1395667009,5)
              else
              call SetUnitAbilityLevel(GetTriggerUnit(),1395667009,GetUnitAbilityLevel(GetTriggerUnit(),1093679158))
              endif
              endif
              if(GetLearnedSkill()==1093679173)then
              call UnitAddAbility(GetTriggerUnit(),1093679171)
              if(KBI())then
              call SetUnitAbilityLevel(GetTriggerUnit(),1093679171,5)
              else
              call SetUnitAbilityLevel(GetTriggerUnit(),1093679171,GetUnitAbilityLevel(GetTriggerUnit(),1093679173))
              endif
              endif
              endfunction
              function MLI takes unit X9I,integer MMI returns nothing
              call UnitAddAbility(X9I,MMI)
              call UnitMakeAbilityPermanent(X9I,true,MMI)
              endfunction
              function KBI takes nothing returns boolean
              if(GetTimeOfDay()>6.00 and GetTimeOfDay()<18.00)then
              return true
              else
              return false
              endif
              endfunction
              function B84 takes nothing returns nothing
              local integer XII=GetHandleId(GetTriggeringTrigger())
              local unit B64=(LoadUnitHandle(HY,(XII),(304)))
              if B64!=null and KBI()and MNI(B64)==false then
              call UnitRemoveAbility(B64,1093742902)
              call UnitRemoveAbility(B64,1093742903)
              call SetUnitAbilityLevel(B64,1395667009,5)
              call SetUnitAbilityLevel(B64,1093679171,5)
              elseif B64!=null and KBI()==false and MNI(B64)==false then
              call MLI(B64,1093742902)
              call MLI(B64,1093742903)
              call SetUnitAbilityLevel(B64,1395667009,GetUnitAbilityLevel(B64,1093679158))
              call SetUnitAbilityLevel(B64,1093679171,GetUnitAbilityLevel(B64,1093679173))
              endif
              endfunction
              简单来说基础技能是个通魔,学习技能后添加一个耐久光环,在6-18点设为5级,其他时间设为通魔等级。奇怪的是SLK里IF貌似只给这个技能设置3个等级的数据,第四级内容就是空了,第五级则连表头都没有还是不太懂SLK啊


              IP属地:山东42楼2012-07-06 21:52
              回复
                好久没看了~很多还有我半成品的注解
                瘟疫
                A15K 1093743947
                code:AOae 耐久光环
                buffID:B0AI
                数值-0.09
                血肉傀儡
                A15J 1093743946
                function ZT1 takes nothing returns nothing
                local trigger t=CreateTrigger()
                call M8I(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
                call TriggerAddCondition(t,Condition(function L63))
                call KWI(1093743947)
                set t=null
                endfunction
                function KWI takes integer KXI returns nothing
                local unit u=CreateUnit(Player(15),1211117657,0,0,270)
                call UnitAddAbility(u,KXI)
                call UnitRemoveAbility(u,KXI)
                call RemoveUnit(u)
                set u=null
                endfunction
                又是注册任意单位发动技能效果事件,同时让傀儡单位预加载技能
                function L63 takes nothing returns boolean
                if GetSpellAbilityId()==1093743946 and GetUnitTypeId(GetTriggerUnit())==1211117650 then
                call L53()
                endif
                return false
                endfunction
                function L53 takes nothing returns nothing
                local unit JTI=GetTriggerUnit()
                local trigger t1=CreateTrigger()
                local integer YF2=GetHandleId(t1)
                local trigger t2=CreateTrigger()
                local integer BBO=GetHandleId(t2)
                local trigger t3=CreateTrigger()
                local integer K63=GetHandleId(t3)
                local integer YRI=GetUnitAbilityLevel(JTI,1093743946)
                set CUI=YRI
                call TriggerRegisterUnitInRange(t1,JTI,750,Condition(function VPI))
                call TriggerAddCondition(t1,Condition(function L43))
                call SaveTriggerHandle(HY,(YF2),(275),(t2))
                call SaveUnitHandle(HY,(YF2),(2),(JTI))
                call TriggerRegisterTimerEvent(t2,30,false)
                call TriggerRegisterUnitEvent(t2,JTI,EVENT_UNIT_DEATH)
                call TriggerAddCondition(t2,Condition(function L23))
                call SaveTriggerHandle(HY,(BBO),(274),(t1))
                call SaveUnitHandle(HY,(BBO),(2),(JTI))
                call SaveBoolean(HY,(BBO),(273),(false))
                call TriggerRegisterTimerEvent(t3,0.01,false)
                call TriggerAddCondition(t3,Condition(function L13))
                call SaveUnitHandle(HY,(K63),(2),(JTI))
                set JTI=null
                set t1=null
                set t2=null
                set t3=null
                endfunction
                注册3个触发器,触发器的大部分内容在下文的函数里,除了给t2注册30秒时间事件、单位死亡事件(尸王死亡)
                function VPI takes nothing returns boolean
                return true
                endfunction
                function L43 takes nothing returns boolean
                local trigger t1=GetTriggeringTrigger()
                local integer YF2=GetHandleId(t1)
                local trigger t2=(LoadTriggerHandle(HY,(YF2),(275)))
                local integer BBO=GetHandleId(t2)
                local unit JRI=GetTriggerUnit()
                local unit JTI=(LoadUnitHandle(HY,(YF2),(2)))
                if IsUnitEnemy(JTI,GetOwningPlayer(JRI))==true and IsUnitType(JRI,UNIT_TYPE_STRUCTURE)==false and GetUnitAbilityLevel(JRI,1093678162)==0 then
                if(LoadBoolean(HY,(BBO),(GetHandleId(JRI))))==false then
                call TriggerRegisterUnitEvent(t2,JRI,EVENT_UNIT_DAMAGED)
                call TriggerRegisterUnitEvent(t2,JRI,EVENT_UNIT_DEATH)
                call SaveBoolean(HY,(BBO),(GetHandleId(JRI)),(true))
                endif
                endif
                set t1=null
                set t2=null
                set JRI=null
                set JTI=null
                return false
                endfunction
                t1的实际功能,进入尸王750范围内的单位进过判断是敌人、不是建筑、没有标记技能A04R(免疫触发的那个技能)以后注册被伤害事件、死亡事件到t2


                IP属地:山东46楼2012-07-16 11:23
                回复
                  2025-08-10 18:10:48
                  广告
                  不感兴趣
                  开通SVIP免广告

                  function L23 takes nothing returns boolean
                  local trigger t2=GetTriggeringTrigger()
                  local integer BBO=GetHandleId(t2)
                  local trigger t1=(LoadTriggerHandle(HY,(BBO),(274)))
                  local integer YF2=GetHandleId(t1)
                  local unit JTI=(LoadUnitHandle(HY,(BBO),(2)))
                  local unit JRI
                  local real d
                  local real a
                  local boolean L33=(LoadBoolean(HY,(BBO),(273)))
                  if(GetTriggerEventId()==EVENT_UNIT_DEATH and GetTriggerUnit()==JTI)or(GetTriggerEventId()!=EVENT_UNIT_DAMAGED and GetTriggerEventId()!=EVENT_UNIT_DEATH)then
                  call FlushChildHashtable(HY,(YF2))
                  call FlushChildHashtable(HY,(BBO))
                  call WTI(t1)
                  call WTI(t2)
                  elseif GetTriggerEventId()==EVENT_UNIT_DEATH then
                  if IsUnitIllusion(GetDyingUnit())==false then
                  call N1I(GetDyingUnit(),JTI,1747990361,"LO3",600)
                  endif
                  elseif L33==false then
                  set JRI=GetTriggerUnit()
                  set d=L9I(JTI,JRI)
                  if d<775 and GetEventDamage()>4 then
                  if LI3(JTI)then
                  set a=20+5*CUI
                  else
                  set a=15+5*CUI
                  endif
                  if d>200 then
                  set a=a-15*((d-150)/(775-150))
                  endif
                  call SaveBoolean(HY,(BBO),(273),(true))
                  call JSI(GetEventDamageSource(),GetTriggerUnit(),3,GetEventDamage()*a/100)
                  call SaveBoolean(HY,(BBO),(273),(false))
                  endif
                  endif
                  set t2=null
                  set t1=null
                  set JTI=null
                  set JRI=null
                  return false
                  endfunction
                  在其它函数的辅助下,若是尸王死亡触发事件则摧毁触发器t1、t2,若是非幻象敌人死亡则,根据距离由尸王对目标造成英雄攻击魔法伤害
                  function N1I takes unit JTI,unit JRI,integer NOI,string N2I,real MRI returns trigger
                  local trigger t=CreateTrigger()
                  local integer XII=GetHandleId(t)
                  local real L5I=GetUnitX(JTI)
                  local real L6I=GetUnitY(JTI)
                  local real N3I=GetUnitFacing(JTI)
                  call TriggerRegisterTimerEvent(t,0.03,true)
                  call TriggerAddCondition(t,Condition(function MSI))
                  call SaveReal(HY,(XII),(44),((MRI)*1.0))
                  call SaveInteger(HY,(XII),(30),(WVI(JRI)))
                  call SaveStr(HY,(XII),(46),(N2I))
                  call SaveInteger(HY,(XII),(43),(WVI(JTI)))
                  call SaveUnitHandle(HY,(XII),(45),(CreateUnit(GetOwningPlayer(JTI),NOI,L5I,L6I,N3I)))
                  set CK=t
                  set t=null
                  return CK
                  endfunction
                  function WVI takes unit u returns integer
                  set YY=YY+1
                  if YY>16000 then
                  set XY[YY-16000]=u
                  elseif YY>8000 then
                  set WY[YY-8000]=u
                  else
                  set VY[YY]=u
                  endif
                  return YY
                  endfunction
                  function MSI takes nothing returns boolean
                  local trigger t=GetTriggeringTrigger()
                  local integer XII=GetHandleId(t)
                  local integer K0I=(LoadInteger(HY,(XII),(30)))
                  local unit JRI=WHI(K0I)
                  local integer MTI=(LoadInteger(HY,(XII),(43)))
                  local unit JTI=WHI(MTI)
                  local real MRI=(LoadReal(HY,(XII),(44)))
                  local unit MPI=(LoadUnitHandle(HY,(XII),(45)))
                  local real x=GetUnitX(MPI)
                  local real y=GetUnitY(MPI)
                  local real L7I=GetUnitX(JRI)
                  local real L8I=GetUnitY(JRI)
                  local real MQI=MRI*0.03
                  local real MUI=LQI(x,y,L7I,L8I)
                  local real N0I=x+MQI*Cos(MUI*bj_DEGTORAD)
                  local real NII=y+MQI*Sin(MUI*bj_DEGTORAD)
                  call SetUnitX(MPI,N0I)
                  call SetUnitY(MPI,NII)
                  call SetUnitFacing(MPI,MUI)
                  if MNI(JRI)then
                  call KillUnit(MPI)
                  call WGI(K0I)
                  call FlushChildHashtable(HY,(XII))
                  call WTI(t)
                  elseif MBI(L7I,L8I,N0I,NII)<=MQI then
                  call KillUnit(MPI)
                  set IK=JTI
                  set OK=JRI
                  call ExecuteFunc((LoadStr(HY,(XII),(46))))
                  call WGI(K0I)
                  call FlushChildHashtable(HY,(XII))
                  call WTI(t)
                  endif
                  set t=null
                  set JRI=null
                  set JTI=null
                  set MPI=null
                  return false
                  endfunction
                  function WHI takes integer i returns unit
                  if i>16000 then
                  return XY[i-16000]
                  elseif i>8000 then
                  return WY[i-8000]
                  else
                  return VY[i]
                  endif
                  endfunction
                  function WGI takes integer i returns nothing
                  if i>16000 then
                  set XY[i-16000]=null
                  elseif i>8000 then
                  set WY[i-8000]=null
                  else
                  set VY[i]=null
                  endif
                  endfunction
                  function MNI takes unit u returns boolean
                  return GetUnitTypeId(u)<1 or IsUnitType(u,UNIT_TYPE_DEAD)==true
                  endfunction
                  以上是对目标死亡的函数


                  IP属地:山东47楼2012-07-16 11:24
                  回复

                    unction L9I takes unit JTI,unit JRI returns real
                    local real L5I=GetUnitX(JTI)
                    local real L6I=GetUnitY(JTI)
                    local real L7I=GetUnitX(JRI)
                    local real L8I=GetUnitY(JRI)
                    if JTI==null or JRI==null then
                    return I2R(9999999999)
                    else
                    return SquareRoot((L5I-L7I)*(L5I-L7I)+(L6I-L8I)*(L6I-L8I))
                    endif
                    return 1.0
                    endfunction
                    这个函数判断尸王和目标是否死亡,或者两人的距离
                    function LI3 takes unit XDI returns boolean
                    if QVI(XDI,F50[YV0])!=null then
                    return true
                    endif
                    return false
                    endfunction
                    function QVI takes unit XDI,integer LNI returns item
                    local integer VXI
                    local item LSI
                    set VXI=0
                    loop
                    exitwhen VXI>5
                    set LSI=UnitItemInSlot(XDI,VXI)
                    if(LSI!=null)and(GetItemTypeId(LSI)==LNI)then
                    set LSI=null
                    return UnitItemInSlot(XDI,VXI)
                    endif
                    set VXI=VXI+1
                    endloop
                    set LSI=null
                    return null
                    endfunction
                    以上两个函数判断是否有A杖
                    function WTI takes trigger t returns nothing
                    call DisableTrigger(t)
                    set IJ=IJ+1
                    set QY[IJ]=t
                    set UY[IJ]=(TimerGetElapsed(M))+60
                    if IJ>8000 then
                    call WSI()
                    endif
                    endfunction
                    摧毁触发器t
                    function WSI takes nothing returns nothing
                    local integer i=0
                    if U2==false and SC0==false then
                    loop
                    call DisplayTimedTextToPlayer(Player(i),0,0,120,"|c00ff0303An internal checksum has failed|r")
                    call DisplayTimedTextToPlayer(Player(i),0,0,120,"|c00ff0303This might not be a serious glitch, but it is important for me to get it|r")
                    call DisplayTimedTextToPlayer(Player(i),0,0,120,"|c00ff0303Please send me the replay for this game to IceFrog@gmail.com|r")
                    set i=i+1
                    exitwhen i==12
                    endloop
                    endif
                    endfunction
                    以上应该是错误的自检程序,出现问题时会给玩家发消息致信IF报告数据
                    function L13 takes nothing returns boolean
                    local trigger t=GetTriggeringTrigger()
                    local integer XII=GetHandleId(t)
                    local unit JTI=(LoadUnitHandle(HY,(XII),(2)))
                    local integer YRI=GetUnitAbilityLevel(JTI,1093743946)
                    call SetUnitAbilityLevel(JTI,1093743947,YRI)
                    call FlushChildHashtable(HY,(XII))
                    call WTI(t)
                    set t=null
                    set JTI=null
                    return false
                    endfunction
                    简而言之是使用技能后及时注册3个触发器。t3为发动技能效果0.01秒后设置瘟疫技能等级等于血肉傀儡技能等级,t1为进入尸王750范围区域


                    IP属地:山东48楼2012-07-16 11:24
                    回复
                      47楼就是没怎么弄懂的部分了,目测和根据距离改变移动速度有关系,似乎是用XY坐标做的。另外我至今没找见哪里是给尸王回血的


                      IP属地:山东49楼2012-07-16 11:27
                      回复
                        慢慢终于磕出来瘟疫了


                        IP属地:山东51楼2012-07-21 17:18
                        回复

                          瘟疫
                          A15K /1093743947
                          code:AOae 耐久光环
                          buffID:B0AI
                          数值-0.09
                          血肉傀儡
                          A15J /1093743946
                          function ZT1 takes nothing returns nothing
                          local trigger t=CreateTrigger()
                          call M8I(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
                          call TriggerAddCondition(t,Condition(function L63))
                          call KWI(1093743947)
                          set t=null
                          endfunction
                          function KWI takes integer KXI returns nothing
                          local unit u=CreateUnit(Player(15),1211117657,0,0,270)
                          call UnitAddAbility(u,KXI)
                          call UnitRemoveAbility(u,KXI)
                          call RemoveUnit(u)
                          set u=null
                          endfunction
                          又是注册任意单位发动技能效果事件,同时让傀儡单位预加载技能
                          function L63 takes nothing returns boolean
                          if GetSpellAbilityId()==1093743946 and GetUnitTypeId(GetTriggerUnit())==1211117650 then
                          call L53()
                          endif
                          return false
                          endfunction
                          function L53 takes nothing returns nothing
                          local unit JTI=GetTriggerUnit()
                          local trigger t1=CreateTrigger()
                          local integer YF2=GetHandleId(t1)
                          local trigger t2=CreateTrigger()
                          local integer BBO=GetHandleId(t2)
                          local trigger t3=CreateTrigger()
                          local integer K63=GetHandleId(t3)
                          local integer YRI=GetUnitAbilityLevel(JTI,1093743946)
                          set CUI=YRI
                          call TriggerRegisterUnitInRange(t1,JTI,750,Condition(function VPI))
                          call TriggerAddCondition(t1,Condition(function L43))
                          call SaveTriggerHandle(HY,(YF2),(275),(t2))
                          call SaveUnitHandle(HY,(YF2),(2),(JTI))
                          call TriggerRegisterTimerEvent(t2,30,false)
                          call TriggerRegisterUnitEvent(t2,JTI,EVENT_UNIT_DEATH)
                          call TriggerAddCondition(t2,Condition(function L23))
                          call SaveTriggerHandle(HY,(BBO),(274),(t1))
                          call SaveUnitHandle(HY,(BBO),(2),(JTI))
                          call SaveBoolean(HY,(BBO),(273),(false))
                          call TriggerRegisterTimerEvent(t3,0.01,false)
                          call TriggerAddCondition(t3,Condition(function L13))
                          call SaveUnitHandle(HY,(K63),(2),(JTI))
                          set JTI=null
                          set t1=null
                          set t2=null
                          set t3=null
                          endfunction
                          注册3个触发器,触发器的大部分内容在下文的函数里,除了给t1注册单位进入尸王750范围内事件,t2注册30秒时间事件、单位死亡事件(尸王死亡),t3注册游戏时间过去0.01秒事件
                          function VPI takes nothing returns boolean
                          return true
                          endfunction
                          function L43 takes nothing returns boolean
                          local trigger t1=GetTriggeringTrigger()
                          local integer YF2=GetHandleId(t1)
                          local trigger t2=(LoadTriggerHandle(HY,(YF2),(275)))
                          local integer BBO=GetHandleId(t2)
                          local unit JRI=GetTriggerUnit()
                          local unit JTI=(LoadUnitHandle(HY,(YF2),(2)))
                          if IsUnitEnemy(JTI,GetOwningPlayer(JRI))==true and IsUnitType(JRI,UNIT_TYPE_STRUCTURE)==false and GetUnitAbilityLevel(JRI,1093678162)==0 then
                          if(LoadBoolean(HY,(BBO),(GetHandleId(JRI))))==false then
                          call TriggerRegisterUnitEvent(t2,JRI,EVENT_UNIT_DAMAGED)
                          call TriggerRegisterUnitEvent(t2,JRI,EVENT_UNIT_DEATH)
                          call SaveBoolean(HY,(BBO),(GetHandleId(JRI)),(true))
                          endif
                          endif
                          set t1=null
                          set t2=null
                          set JRI=null
                          set JTI=null
                          return false
                          endfunction
                          t1的实际功能,进入尸王750范围内的单位进过判断是敌人、不是建筑、没有标记技能A04R(免疫触发的那个技能)以后注册被伤害事件、死亡事件到t2


                          IP属地:山东52楼2012-07-21 17:18
                          回复

                            function L23 takes nothing returns boolean
                            local trigger t2=GetTriggeringTrigger()
                            local integer BBO=GetHandleId(t2)
                            local trigger t1=(LoadTriggerHandle(HY,(BBO),(274)))
                            local integer YF2=GetHandleId(t1)
                            local unit JTI=(LoadUnitHandle(HY,(BBO),(2)))
                            local unit JRI
                            local real d
                            local real a
                            local boolean L33=(LoadBoolean(HY,(BBO),(273))) 这个布尔值为false
                            if(GetTriggerEventId()==EVENT_UNIT_DEATH and GetTriggerUnit()==JTI)or(GetTriggerEventId()!=EVENT_UNIT_DAMAGED and GetTriggerEventId()!=EVENT_UNIT_DEATH)then
                            call FlushChildHashtable(HY,(YF2))
                            call FlushChildHashtable(HY,(BBO))
                            call WTI(t1)
                            call WTI(t2) 尸王死亡摧毁t1、t2
                            elseif GetTriggerEventId()==EVENT_UNIT_DEATH then
                            if IsUnitIllusion(GetDyingUnit())==false then
                            call N1I(GetDyingUnit(),JTI,1747990361,"LO3",600)
                            endif
                            elseif L33==false then
                            set JRI=GetTriggerUnit()
                            set d=L9I(JTI,JRI)
                            if d<775 and GetEventDamage()>4 then 如果尸王和目标距离小于775且伤害值大于4
                            if LI3(JTI)then
                            set a=20+5*CUI
                            else
                            set a=15+5*CUI
                            endif
                            if d>200 then
                            set a=a-15*((d-150)/(775-150))
                            endif
                            call SaveBoolean(HY,(BBO),(273),(true))
                            call JSI(GetEventDamageSource(),GetTriggerUnit(),3,GetEventDamage()*a/100)
                            call SaveBoolean(HY,(BBO),(273),(false))
                            endif
                            endif
                            set t2=null
                            set t1=null
                            set JTI=null
                            set JRI=null
                            return false
                            endfunction
                            t2实际功能,在其它函数的辅助下,若是尸王死亡触发事件则摧毁触发器t1、t2,若是非幻象敌人死亡则运行函数N1I(鄙人愚钝,虽然废了老鼻子劲终于读出来了,但觉得这函数完全无蛋用~),都不是则根据距离由尸王对目标造成英雄攻击魔法伤害
                            function N1I takes unit JTI,unit JRI,integer NOI,string N2I,real MRI returns trigger
                            local trigger t=CreateTrigger() 创建触发器t
                            local integer XII=GetHandleId(t)
                            local real L5I=GetUnitX(JTI)
                            local real L6I=GetUnitY(JTI)
                            local real N3I=GetUnitFacing(JTI) 获得死亡单位X、Y坐标和面向角度
                            call TriggerRegisterTimerEvent(t,0.03,true) 给t注册0.03秒事件
                            call TriggerAddCondition(t,Condition(function MSI)) 添加条件函数MSI
                            call SaveReal(HY,(XII),(44),((MRI)*1.0)) 存储实数600
                            call SaveInteger(HY,(XII),(30),(WVI(JRI))) 存储整数,
                            call SaveStr(HY,(XII),(46),(N2I))
                            call SaveInteger(HY,(XII),(43),(WVI(JTI)))
                            call SaveUnitHandle(HY,(XII),(45),(CreateUnit(GetOwningPlayer(JTI),NOI,L5I,L6I,N3I)))
                            给死亡单位的所有者创建傀儡单位在死亡单位的X、Y坐标并面向死亡单位的面向角度
                            set CK=t
                            set t=null
                            return CK
                            endfunction
                            function WVI takes unit u returns integer
                            set YY=YY+1
                            if YY>16000 then
                            set XY[YY-16000]=u
                            elseif YY>8000 then
                            set WY[YY-8000]=u
                            else
                            set VY[YY]=u
                            endif
                            return YY
                            endfunction
                            function MSI takes nothing returns boolean
                            local trigger t=GetTriggeringTrigger()
                            local integer XII=GetHandleId(t)
                            local integer K0I=(LoadInteger(HY,(XII),(30)))
                            local unit JRI=WHI(K0I)
                            local integer MTI=(LoadInteger(HY,(XII),(43)))
                            local unit JTI=WHI(MTI)
                            local real MRI=(LoadReal(HY,(XII),(44)))
                            local unit MPI=(LoadUnitHandle(HY,(XII),(45)))
                            local real x=GetUnitX(MPI)
                            local real y=GetUnitY(MPI)
                            local real L7I=GetUnitX(JRI)
                            local real L8I=GetUnitY(JRI)
                            local real MQI=MRI*0.03 600*0.03,就是18了
                            local real MUI=LQI(x,y,L7I,L8I)
                            local real N0I=x+MQI*Cos(MUI*bj_DEGTORAD)
                            local real NII=y+MQI*Sin(MUI*bj_DEGTORAD)
                            call SetUnitX(MPI,N0I)
                            call SetUnitY(MPI,NII)
                            call SetUnitFacing(MPI,MUI) 设置傀儡单位X、Y坐标为由傀儡单位向尸王移动18距离,面向尸王
                            if MNI(JRI)then 如果尸王死亡
                            call KillUnit(MPI)
                            call WGI(K0I)
                            call FlushChildHashtable(HY,(XII))
                            call WTI(t) 排泄变量和哈希表,摧毁触发器t
                            elseif MBI(L7I,L8I,N0I,NII)<=MQI then 如果傀儡单位单位和尸王距离小于等于18
                            call KillUnit(MPI)
                            set IK=JTI
                            set OK=JRI
                            call ExecuteFunc((LoadStr(HY,(XII),(46))))
                            call WGI(K0I)
                            call FlushChildHashtable(HY,(XII))
                            call WTI(t)
                            endif
                            set t=null
                            set JRI=null
                            set JTI=null
                            set MPI=null
                            return falseendfunction


                            IP属地:山东53楼2012-07-21 17:23
                            回复
                              2025-08-10 18:04:48
                              广告
                              不感兴趣
                              开通SVIP免广告

                              function LQI takes real x1,real y1,real x2,real y2 returns real
                              return bj_RADTODEG*Atan2(y2-y1,x2-x1)
                              endfunction 获取(x1,y1)到(x2,y2)的角度
                              function WHI takes integer i returns unit
                              if i>16000 then
                              return XY[i-16000]
                              elseif i>8000 then
                              return WY[i-8000]
                              else
                              return VY[i]
                              endif
                              endfunction
                              这个函数配合上面的WVI函数在两个函数间通过传递一个整数变量完成单位变量的传递
                              function WGI takes integer i returns nothing
                              if i>16000 then
                              set XY[i-16000]=null
                              elseif i>8000 then
                              set WY[i-8000]=null
                              else
                              set VY[i]=null
                              endif
                              endfunction
                              排泄WHI、WVI函数使用的变量
                              function MNI takes unit u returns boolean
                              return GetUnitTypeId(u)<1 or IsUnitType(u,UNIT_TYPE_DEAD)==true
                              endfunction
                              一个返回布尔值的函数,如果单位不存在(被触发删除或尸体消失)或单位死亡则返回true,否则false
                              function MBI takes real x1,real y1,real x2,real y2 returns real
                              return SquareRoot(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)))
                              获取点(x1,y1),(x2,y2)的距离
                              function L9I takes unit JTI,unit JRI returns real
                              local real L5I=GetUnitX(JTI)
                              local real L6I=GetUnitY(JTI)
                              local real L7I=GetUnitX(JRI)
                              local real L8I=GetUnitY(JRI)
                              if JTI==null or JRI==null then
                              return I2R(9999999999)
                              else
                              return SquareRoot((L5I-L7I)*(L5I-L7I)+(L6I-L8I)*(L6I-L8I))
                              endif
                              return 1.0
                              endfunction
                              这个函数判断尸王或目标是死亡则I2R(9999999999),或者两人的距离
                              function LI3 takes unit XDI returns boolean
                              if QVI(XDI,F50[YV0])!=null then
                              return true
                              endif
                              return false
                              endfunction
                              function QVI takes unit XDI,integer LNI returns item
                              local integer VXI
                              local item LSI
                              set VXI=0
                              loop
                              exitwhen VXI>5
                              set LSI=UnitItemInSlot(XDI,VXI)
                              if(LSI!=null)and(GetItemTypeId(LSI)==LNI)then
                              set LSI=null
                              return UnitItemInSlot(XDI,VXI)
                              endif
                              set VXI=VXI+1
                              endloop
                              set LSI=null
                              return null
                              endfunction以上两个函数判断是否有A杖


                              IP属地:山东54楼2012-07-21 17:24
                              回复