找回密码
 点一下
查看: 2229|回复: 8

跪求回光返照原理

  [复制链接]
发表于 2008-7-23 16:58:07 | 显示全部楼层 |阅读模式
看了那个回光返照的帖子
但是那个原理我是一头雾水 谁能解释一下
发表于 2008-7-23 18:07:27 | 显示全部楼层
那帖不是有演示嘛,虽然可能有点问题………………

我的思路原理大概如下:
接受伤害事件->获取当前生命值&伤害&设置生命值->开启0秒计时器->计时器到期恢复生命值
回复

使用道具 举报

发表于 2008-7-23 19:42:50 | 显示全部楼层
引用第1楼zhuzeitou于2008-07-23 18:07发表的  :
那帖不是有演示嘛,虽然可能有点问题………………

我的思路原理大概如下:
接受伤害事件->获取当前生命值&伤害&设置生命值->开启0秒计时器->计时器到期恢复生命值



有点问题………………
额……坦率地说,我是直接把破解版中的J翻译成了T
不过众所周知T中的计时器和J中不可同日而语,所以很少情况下会出现问题。。。
额……另外,猪头那个只是先减后加,原理有一部分是对的,不过不是完完全全正确
回复

使用道具 举报

发表于 2008-7-23 20:01:52 | 显示全部楼层
破解版中的源代码:

function BurrowTime_Spell takes nothing returns boolean
    return GetLearnedSkill()=='A0NS'and IsUnitIllusion(GetTriggerUnit())==false
endfunction

function BurrowTime_Main takes nothing returns nothing
    local string lf5=H2Tx(GetTriggeringTrigger())
    local boolean lrF=GetBoolean(lf5,"BTOn")
    local boolean lrg=GetBoolean(lf5,"BTDuration")
    if(lrg)then
        call DelayedDamageCheck(GetTriggerUnit(),GetEventDamage()) //这个最关键
    elseif(lrF==false and((GetTriggerEventId()==EVENT_UNIT_DAMAGED and GetUnitState(GetTriggerUnit(),UNIT_STATE_LIFE)<400)or(GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT)))then
        call UnitRemoveBuffsBJ(1,GetTriggerUnit())
        if(GetTriggerEventId()==EVENT_UNIT_DAMAGED)then
            call DisableTrigger(GetTriggeringTrigger())
            call IssueImmediateOrderById(GetTriggerUnit(),OrderId("windwalk"))
            call EnableTrigger(GetTriggeringTrigger())
        endif
        set lrF=true
        set lrg=true
        call SetBoolean(lf5,"BTOn",lrF)
        call SetBoolean(lf5,"BTDuration",lrg)
        call SetHandle(lf5,"BTFX",AddSpecialEffectTarget("Abilities\\\\Spells\\\\Undead\\\\Unsummon\\\\UnsummonTarget.mdl",GetTriggerUnit(),"origin"))
        call ExecuteFunc("EndDuration"+I2S(2+GetUnitAbilityLevel(GetTriggerUnit(),'A0NS')))
        call ExecuteFunc("BurrowTime_Off")
    endif
endfunction

function BurrowTime_Event takes nothing returns boolean
    if(GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT)then
        if(GetSpellAbilityId()=='A0NS')then
            return true
        endif
    endif
    if(GetTriggerEventId()==EVENT_UNIT_DAMAGED)then
        if GetEventDamage()>1 then
            return true
        endif
    endif
    return false
endfunction

function BurrowTime_Run takes nothing returns nothing
    local trigger ltt
    if(GetUnitAbilityLevel(GetTriggerUnit(),'A0NS')==1)then
        set ltt=CreateTrigger()
        call SetBoolean(H2Tx(ltt),"BTOn",false)
        call TriggerRegisterUnitEvent(ltt,GetTriggerUnit(),EVENT_UNIT_DAMAGED)
        call TriggerRegisterUnitEvent(ltt,GetTriggerUnit(),EVENT_UNIT_SPELL_EFFECT)
        call TriggerAddAction(ltt,function BurrowTime_Main)
        call TriggerAddCondition(ltt,Condition(function BurrowTime_Event))
    endif
endfunction

function BurrowTime_Init takes nothing returns nothing
    local trigger ltt=CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(ltt,EVENT_PLAYER_HERO_SKILL)
    call TriggerAddCondition(ltt,Condition(function BurrowTime_Spell))
    call TriggerAddAction(ltt,function BurrowTime_Run)
endfunction


function InitTrig_Borrowed_Time takes nothing returns nothing
endfunction
回复

使用道具 举报

发表于 2008-7-23 20:03:39 | 显示全部楼层
function DelayedDamageCheck takes unit pEU,real pf7 returns nothing
    local real lf9=GetUnitState(pEU,UNIT_STATE_MAX_LIFE) //设置lf9为最大生命值
   local real lFa=GetUnitState(pEU,UNIT_STATE_LIFE)//设置lFa为当前生命值
    if pf7>(lf9-lFa)then //如果所受伤害大于最大生命值-当前生命值
        if pf7>=lFa then //如果所受伤害大于等于当前生命值
            call SetUnitState(pEU,UNIT_STATE_LIFE,lf9) //设置单位满血
            call DelayedDamage(pEU,pf7-(lf9-lFa)) //调用××函数,开启定时器,加回“所受伤害-(最大生命值-当前生命值)”的值
        else
            call DelayedDamage(pEU,pf7)//调用××函数,开启定时器,加回所受伤害
        endif
    else
        call SetUnitState(pEU,UNIT_STATE_LIFE,GetUnitState(pEU,UNIT_STATE_LIFE)+pf7))//直接设置单位生命值为当前生命值+所受伤害
    endif
endfunction

function DelayedDamageTimer takes nothing returns nothing
    local string lf5=H2Tx(GetExpiredTimer())
    local unit lEU=GetUnit(lf5,"Unit")
    call SetUnitState(lEU,UNIT_STATE_LIFE,GetUnitState(lEU,UNIT_STATE_LIFE)+GetReal(lf5,"Damage"))
endfunction

function DelayedDamage takes unit pEU,real pf7 returns nothing
    local timer ltt=CreateTimer()
    local string lf5=H2Tx(ltt)
    call SetReal(lf5,"Damage",pf7)
    call SetHandle(lf5,"Unit",pEU)
    call TimerStart(ltt,0,false,function DelayedDamageTimer)
endfunction
回复

使用道具 举报

 楼主| 发表于 2008-7-23 21:16:16 | 显示全部楼层
还是完全看不懂啊!!!!!!!!
回复

使用道具 举报

发表于 2008-7-23 23:36:34 | 显示全部楼层
那么就先去学习魔兽、WE、触发以及jass的基本知识吧
回复

使用道具 举报

发表于 2008-7-24 17:15:18 | 显示全部楼层
相信猪头是看懂了的。怎么看懂的?因为了解JASS。所以楼主去学习把
回复

使用道具 举报

发表于 2008-7-24 19:19:52 | 显示全部楼层
其实我只是看大概而已啦,因为自己这段时间在做一个类似简易伤害系统的东西玩,就是承受伤害的增减、乘算这种
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-1 02:15 , Processed in 0.056070 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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