找回密码
 点一下
查看: 3906|回复: 30

帮新手个忙!怎么也弄不好!或许你弄了这个能帮到我...!

[复制链接]
发表于 2008-2-8 11:39:01 | 显示全部楼层 |阅读模式
如题   请把我发的两个触发转化后的JASS弄好..



主要是 把里面的  一直增加事件的泄露给弄了...拜托了.


无论你用动态注册 什么什么的都好....


我放东西了请看下面



[codes=jass]//===========================================================================
// Trigger: lengshang
//===========================================================================
function Trig_lengshang_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A02F' ) ) then
        return false
    endif
    return true
endfunction

function Trig_lengshang_Actions takes nothing returns nothing
    set udg_LengshangNumber = 0
    set udg_Lengshang_Caster = GetSpellAbilityUnit()
    set udg_Lengshang_Target = GetSpellTargetUnit()
    call TriggerRegisterUnitEvent( gg_trg_lengshang2, udg_Lengshang_Target, EVENT_UNIT_DAMAGED )
    call EnableTrigger( gg_trg_lengshang2 )
endfunction

//===========================================================================
function InitTrig_lengshang takes nothing returns nothing
    set gg_trg_lengshang = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_lengshang, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_lengshang, Condition( function Trig_lengshang_Conditions ) )
    call TriggerAddAction( gg_trg_lengshang, function Trig_lengshang_Actions )
endfunction

//===========================================================================
// Trigger: lengshang2
//===========================================================================
function Trig_lengshang2_Conditions takes nothing returns boolean
    if ( not ( udg_LengshangNumber != 1 ) ) then
        return false
    endif
    if ( not ( GetEventDamageSource() == udg_Lengshang_Caster ) ) then
        return false
    endif
    if ( not ( UnitHasBuffBJ(udg_Lengshang_Target, 'B01U') == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_lengshang2_Func005C takes nothing returns boolean
    if ( not ( GetRandomPercentageBJ() < I2R(( 3 + ( GetUnitAbilityLevelSwapped('A0E9', udg_Lengshang_Caster) * 11 ) )) ) ) then
        return false
    endif
    return true
endfunction

function Trig_lengshang2_Actions takes nothing returns nothing
    set udg_LengshangNumber = 1
    if ( Trig_lengshang2_Func005C() ) then
        call UnitDamageTarget( udg_Lengshang_Caster, udg_Lengshang_Target, GetEventDamage(), true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
        call AddSpecialEffectTargetUnitBJ( "head", udg_Lengshang_Target, "Abilities\\Spells\\Other\\CrushingWave\\CrushingWaveDamage.mdl" )
        call DestroyEffect( GetLastCreatedEffectBJ() )
        call DisableTrigger( GetTriggeringTrigger() )
    else
    endif
endfunction

//===========================================================================
function InitTrig_lengshang2 takes nothing returns nothing
    set gg_trg_lengshang2 = CreateTrigger(  )
    call DisableTrigger( gg_trg_lengshang2 )
    call TriggerAddCondition( gg_trg_lengshang2, Condition( function Trig_lengshang2_Conditions ) )
    call TriggerAddAction( gg_trg_lengshang2, function Trig_lengshang2_Actions )
endfunction[/codes]
发表于 2008-2-8 13:13:15 | 显示全部楼层
很抱歉,我只能用动态事件来作出这样的东西,不过只要你细读代码
还是可以理解的
[jass]
//===========================================================================
// Trigger: lengshang
//===========================================================================
//这个写到上面
function Trig_lengshang2_Actions takes nothing returns nothing
    call DestroyTrigger(GetTriggeringTrigger())
    if udg_LengshangNumber==1 and GetEventDamageSource()==udg_Lengshang_Caster and UnitHasBuffBJ(udg_Lengshang_Target,'B01U')then
        //条件合并到这里
        set udg_LengshangNumber = 1
        if GetRandomInt(0,100) <  3 + ( GetUnitAbilityLevelSwapped('A0E9', udg_Lengshang_Caster) * 11 ) then
            //这样更效率
            call UnitDamageTarget( udg_Lengshang_Caster, udg_Lengshang_Target, GetEventDamage(), true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
            call AddSpecialEffectTargetUnitBJ( "head", udg_Lengshang_Target, "Abilities\\\\Spells\\\\Other\\\\CrushingWave\\\\CrushingWaveDamage.mdl" )
            call DestroyEffect( GetLastCreatedEffectBJ() )
            call DisableTrigger( GetTriggeringTrigger() )
        else
        endif
    endif
endfunction

function Trig_lengshang_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A02F'         
endfunction

function Trig_lengshang_Actions takes nothing returns nothing
    local trigger lengshang2=CreateTrigger()
    set udg_LengshangNumber = 0
    set udg_Lengshang_Caster = GetSpellAbilityUnit()
    set udg_Lengshang_Target = GetSpellTargetUnit()
    call TriggerAddAction(lengshang2,function Trig_lengshang2_Actions)
    call TriggerRegisterUnitEvent( lengshang2, udg_Lengshang_Target, EVENT_UNIT_DAMAGED )
    //这一行就不必了
    //call EnableTrigger( gg_trg_lengshang2 )
endfunction

//===========================================================================
function InitTrig_lengshang takes nothing returns nothing
    set gg_trg_lengshang = CreateTrigger(   )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_lengshang, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_lengshang, Condition( function Trig_lengshang_Conditions ) )
    call TriggerAddAction( gg_trg_lengshang, function Trig_lengshang_Actions )
endfunction

//===========================================================================
// Trigger: lengshang2
//===========================================================================

//===========================================================================
function InitTrig_lengshang2 takes nothing returns nothing
    //这个是必需要的,但什么都不用写  ,除非你删掉lengshang2这个触发器
endfunction
[/jass]
上面在有泄露问题,如果不添加全局变量,或者用缓存,是解决不了的。
为了解决泄露问题,还要创建一个触发动作的变量Lengshang_Action.不过好象用老狼的UI才可以。
修改后在代码是:
[jass]
//===========================================================================
// Trigger: lengshang
//===========================================================================
//这个写到上面
function Trig_lengshang2_Actions takes nothing returns nothing
      call TriggerRemoveAction(GetTriggeringTrigger(),udg_Lengshang_Action)
      call DestroyTrigger(GetTriggeringTrigger())
      if udg_LengshangNumber==1 and GetEventDamageSource()==udg_Lengshang_Caster and UnitHasBuffBJ(udg_Lengshang_Target,'B01U')then
            //条件合并到这里
            set udg_LengshangNumber = 1
            if GetRandomInt(0,100) <   3 + ( GetUnitAbilityLevelSwapped('A0E9', udg_Lengshang_Caster) * 11 ) then
                  //这样更效率
                  call UnitDamageTarget( udg_Lengshang_Caster, udg_Lengshang_Target, GetEventDamage(), true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
                  call AddSpecialEffectTargetUnitBJ( "head", udg_Lengshang_Target, "Abilities\\\\Spells\\\\Other\\\\CrushingWave\\\\CrushingWaveDamage.mdl" )
                  call DestroyEffect( GetLastCreatedEffectBJ() )
                  call DisableTrigger( GetTriggeringTrigger() )
            else
            endif
      endif
endfunction

function Trig_lengshang_Conditions takes nothing returns boolean
      return GetSpellAbilityId() == 'A02F'            
endfunction

function Trig_lengshang_Actions takes nothing returns nothing
      local trigger lengshang2=CreateTrigger()
      set udg_LengshangNumber = 0
      set udg_Lengshang_Caster = GetSpellAbilityUnit()
      set udg_Lengshang_Target = GetSpellTargetUnit()
      set udg_Lengshang_Action = TriggerAddAction(lengshang2,function Trig_lengshang2_Actions)
      call TriggerRegisterUnitEvent( lengshang2, udg_Lengshang_Target, EVENT_UNIT_DAMAGED )
      //这一行就不必了
      //call EnableTrigger( gg_trg_lengshang2 )
endfunction

//===========================================================================
function InitTrig_lengshang takes nothing returns nothing
      set gg_trg_lengshang = CreateTrigger(    )
      call TriggerRegisterAnyUnitEventBJ( gg_trg_lengshang, EVENT_PLAYER_UNIT_SPELL_EFFECT )
      call TriggerAddCondition( gg_trg_lengshang, Condition( function Trig_lengshang_Conditions ) )
      call TriggerAddAction( gg_trg_lengshang, function Trig_lengshang_Actions )
endfunction

//===========================================================================
// Trigger: lengshang2
//===========================================================================

//===========================================================================
function InitTrig_lengshang2 takes nothing returns nothing
      //这个是必需要的,但什么都不用写   ,除非你删掉lengshang2这个触发器
endfunction
[/jass]
----发错分了。。。。发成威望
回复

使用道具 举报

发表于 2008-2-8 13:17:34 | 显示全部楼层
定义一个名为gc的游戏缓存全局变量

自定义脚本里,写下一下这些
[codes=jass]function H2I takes handle h returns integer
    return h
    return 0
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 I2TA takes integer i returns triggeraction
      return i
      return null
endfunction

function GameCache takes nothing returns gamecache
    if udg_gc == null then
        call FlushGameCache(InitGameCache("w3gc.w3v"))
        set udg_gc = InitGameCache("w3gc.w3v")
    endif
    return udg_gc
endfunction

function DestroyTriggerAll takes trigger trg returns nothing
    call TriggerRemoveAction(trg, I2TA(GetStoredInteger(GameCache(), I2S(H2I(trg)), "TriggerAction")))
    call DestroyTrigger(trg)
    call FlushStoredMission(GameCache(), I2S(H2I(trg)))
endfunction[/codes]

将Trig_lengshang_Actions做一下更改
[codes=jass]function Trig_lengshang_Actions takes nothing returns nothing
    local unit caster = GetSpellAbilityUnit()
    local unit target = GetSpellTargetUnit()
    local trigger trg = CreateTrigger()
    local triggeraction ta = TriggerAddAction(trg, function Lengshuang_Action)
    call StoreInteger(GameCaChe(), I2S(H2I(trg)), "caster", H2I(caster))
    call StoreInteger(GameCache(), I2S(H2I(trg)), "TriggerAction", H2I(ta))
    call TriggerRegisterUnitEvent( trg, target, EVENT_UNIT_DAMAGED )
    set caster = null
    set target = null
    set trg = null
    set ta = null
endfunction
[/codes]

在lengshuang触发里添加以下函数
[codes=jass]function Lengshuang_Action takes nothing returns nothing
    local trigger trg = GetTriggeringTrigger()
    local unit caster = I2U(GetStoredInteger(GameCache(), I2S(H2I(trg)), "caster"))
    local unit target = GetTriggerUnit()
    local effect eff
    if GetEventDamageSource() == caster and GetUnitAbilityLevel(target, 'B01U') > 0 then
        call DisableTrigger(trg)
        if GetRandomInt(1, 100) <= 3 + GetUnitAbilityLevel(caster, 'A0E9') * 11 then
            call UnitDamageTarget( caster, target, GetEventDamage(), true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
            set eff = AddSpecialEffectTarget( "Abilities\\\\Spells\\\\Other\\\\CrushingWave\\\\CrushingWaveDamage.mdl", target, "head" )
            call DestroyEffect(eff)
            set eff = null
        endif
        call DestroyTriggerAll(trg)
    endif
    set trg = null
    set caster = null
    set target = null
endfunction[/codes]

把lengshuang2触发删掉

-----------------------------------------------------------------------------------------------------------------
由于无法做测试,最好做好备份
回复

使用道具 举报

发表于 2008-2-8 13:23:54 | 显示全部楼层
[jass]
if GetEventDamageSource() == caster && GetUnitAbilityLevel(target, 'B01U') > 0 then[/jass]
&&好象不是JASS的东西吧 应该是and
还有LS忘了提示GameCache()需要在初始化时调用
回复

使用道具 举报

发表于 2008-2-8 13:27:51 | 显示全部楼层
引用第3楼thynson于2008-02-08 13:23发表的  :

&&好象不是JASS的东西吧 应该是and
还有LS忘了提示GameCache()需要在初始化时调用

额………………谢谢ls………………那个&&已经更正了
GameCache()是不用初始化的,使用缓存时自动判断udg_gc是否为空,为空的话初始化,否则不变的,恩
回复

使用道具 举报

发表于 2008-2-8 13:30:20 | 显示全部楼层
哦,没有细看不好意思
回复

使用道具 举报

发表于 2008-2-8 13:34:15 | 显示全部楼层
我觉得lz想要的应该是ls那样的………………
我改的东西太多了,把格局都变调了
回复

使用道具 举报

发表于 2008-2-8 13:36:20 | 显示全部楼层
不过我还是觉得
[jass]
local gamecache gc=GameCache()
[/jass]
把其他的GameCache()改做gc
这样比较好,直接用效率太底了。
回复

使用道具 举报

发表于 2008-2-8 13:38:07 | 显示全部楼层
引用第7楼thynson于2008-02-08 13:36发表的  :
不过我还是觉得
[jass]
local gamecache gc=GameCache()
[/jass]
把其他的GameCache()改做gc
.......

这倒是的,没想到过,呵呵
很多东西是把以前写的动态注册拿出来复制一下的,成习惯了………………

不过,为什么是local而不是global呢………………
回复

使用道具 举报

发表于 2008-2-8 13:41:23 | 显示全部楼层
呵呵~也是哦。
直接set udg_gc=GameCache()
这样一来才最简洁。
回复

使用道具 举报

发表于 2008-2-8 13:42:40 | 显示全部楼层
引用第9楼thynson于2008-02-08 13:41发表的  :
呵呵~也是哦。
直接set udg_gc=GameCache()
这样一来才最简洁。

恩恩
不过,lz呢………………
回复

使用道具 举报

发表于 2008-2-8 13:44:35 | 显示全部楼层
不在了
回复

使用道具 举报

 楼主| 发表于 2008-2-8 22:34:57 | 显示全部楼层
谢谢~~~  我仔细地看贴里的东西```
回复

使用道具 举报

 楼主| 发表于 2008-2-17 17:44:45 | 显示全部楼层
猪头........ 你那个 在lengshuang 的触发里添加以下函数应该添在哪呀...
回复

使用道具 举报

 楼主| 发表于 2008-2-17 17:47:07 | 显示全部楼层
回复

使用道具 举报

发表于 2008-2-17 17:55:58 | 显示全部楼层
………………怎么过了那么长时间再问………………晕
加在触发的最上面吧

或者就照着1楼的方法做,简单些
回复

使用道具 举报

 楼主| 发表于 2008-2-17 17:57:20 | 显示全部楼层
....... 因为我在看教程以为这样 容易懂些  结果还是不会...

一楼的我也不会...  你比较常在  所以CALL你咯```
回复

使用道具 举报

 楼主| 发表于 2008-2-17 17:58:15 | 显示全部楼层
猪头 为了能准确知道 你在线情况 把你Q给我,....
回复

使用道具 举报

 楼主| 发表于 2008-2-17 18:00:58 | 显示全部楼层
还是出现一系列错误...
回复

使用道具 举报

 楼主| 发表于 2008-2-17 18:05:01 | 显示全部楼层
猪头.. 还是不行啊..  我把自定义代码加了..

其他东西加哪   怎么加不知道要..  总提示许多错误.
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 03:40 , Processed in 0.037873 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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