[Library] Target Cast - Create a dummy and cast spell to a unit

Thảo luận trong 'World Editor' bắt đầu bởi AzuhaSky, 28/4/11.

  1. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Một system sky vừa viết ra!Nói chung nó rất đơn giản để làm nhưng rất hữu dụng với những bạn rành về trigger spell!
    Đây:
    Mã:
    library TargetCast
    //***********************************************************
    //* Target cast Library
    //* Written by Azuha Sky
    //* Requires A Dummy
    //* A simple system but useful!
    //***********************************************************
    //* Dummy Cast Ability Event
    //* Some time,you like create a dummy and order it cast ability
    //* to a unit!But that is bad because some leak can't remove
    //* and it's very long!
    //* And here!You can use this library to cast spell to a target
    //* it's short and useful!
    //***********************************************************
    //* Use this code to cast ability to a target
    //* call TargetCast(unit source,unit target,integer ability,string order,integer level of ability)
    //* or
    //* call TargetCastEx(unit source,unit target,integer ability,string order,real damage,attack attack type,damagetype damage type,integer level)
    //* and Area
    //* call TargetCastLoc(unit source,real x,real y,integer ability,string order,integer level of ability)
    //* call TargetCastLocEx(unit source,real x,real y,integer ability,string order,real damage,attacktype Att,damagetype damage type,integer level of ability,real area effect)
    //* Any effect create with percent (Might be you want create a buff for target with percent cast)
    //* function AdvancedCast takes unit source,unit target,integer spell,string order,integer level,integer percent
    //*
    //* Thank you for using!
    //***********************************************************
    globals
        private constant integer DUMMY_UNITED       =  'o000'   //You can edit that DUMMY UNITED to cast to target  
                                                                                                          // because some you dummy not is this ID!
        private constant integer imID                          =   'Amim' //Requires target unit not Resistant any spell!
        private unit u
    endglobals
    //  *******************
    // ***Using Trigger***
    //  *******************
    function AdvancedCast takes unit source,unit target,integer spell,string order,integer level,integer percent returns nothing
        local unit dummy = CreateUnitAtLoc(GetOwningPlayer(source),DUMMY_UNITED,GetUnitLoc(target),0.0)
        call UnitAddAbility(dummy,spell)
        call UnitAddAbility(dummy,'Aloc')
        call SetUnitAbilityLevel(dummy,spell,level)
        call SetUnitUserData(dummy,0)
        call SetUnitFlyHeight(dummy,0,0)
        call UnitApplyTimedLife(dummy, 'BTLF', 0.50)
        call PauseUnit(dummy,false)
        if percent>GetRandomInt(1,100) then
            if GetUnitAbilityLevel(target,imID)>0 then
                debug call BJDebugMsg("Can't cast ability to this target!May be this target resist this spell!Unit: "+GetUnitName(target))
            else
                call IssueTargetOrder(dummy,order,target)
            endif
        endif
        set dummy = null
        set source = null
        set target = null
    endfunction
    
    function TargetCast takes unit source, unit target, integer spell, string order, integer level returns nothing
        local unit dummy = CreateUnitAtLoc(GetOwningPlayer(source),DUMMY_UNITED,GetUnitLoc(target),0.0)
        call UnitApplyTimedLife(dummy, 'BTLF', 0.40)
        call UnitAddAbility(dummy,spell)
        call UnitAddAbility(dummy,'Aloc')
        call SetUnitAbilityLevel(dummy,spell,level)
        call SetUnitUserData(dummy,0)
        call SetUnitFlyHeight(dummy,0,0)
        call IssueTargetOrder(dummy,order,target)
        call PauseUnit(dummy,false)
        if (GetUnitAbilityLevel(target,imID) > 0) then
            debug call BJDebugMsg("Can't cast ability to this target!May be this target resist this spell!Unit: "+GetUnitName(target))
        endif
        set dummy = null
        set source = null
        set target = null
        set u = null
    endfunction
    
    function TargetCastEx takes unit source, unit target, integer spell, string order, real damage, attacktype Atype, damagetype Dtype, integer level returns nothing
        local unit dummy = CreateUnitAtLoc(GetOwningPlayer(source),DUMMY_UNITED,GetUnitLoc(target),0.0)
        call UnitApplyTimedLife(dummy, 'BTLF', 0.40)
        call UnitAddAbility(dummy,spell)
        call UnitAddAbility(dummy,'Aloc')
        call SetUnitAbilityLevel(dummy,spell,level)
        call SetUnitUserData(dummy,0)
        call SetUnitFlyHeight(dummy,0,0)
        call IssueTargetOrder(dummy,order,target)
        call PauseUnit(dummy,false)
        //Call damage target
        if (GetUnitAbilityLevel(target,imID) > 0) then
            debug call BJDebugMsg("Can't cast ability to this target!May be this target resist this spell!Unit: "+GetUnitName(target))
        else
            call UnitDamageTarget(source,target,damage,false,false,Atype,Dtype,null)
        endif
        if damage ==0 then
             debug call BJDebugMsg("Can't cause damage to target!Please fix error at your trigger!May be real damage taken equal to 0!")
        endif
        set dummy = null
        set source = null
        set target = null
        set u = null
    endfunction
    
    //      *********************
    //     **Location Trigger **
    //      *********************
    
    private function Check takes nothing returns boolean
      return IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(u)) and GetWidgetLife(GetFilterUnit())>0.405 and GetUnitAbilityLevel(GetFilterUnit(),'Avul')==0
    endfunction
    
    function TargetCastLoc takes unit source, real x, real y, integer spell, string order, integer level returns nothing
        local unit dummy = CreateUnit(GetOwningPlayer(source),DUMMY_UNITED,x,y,0.0)
        call UnitApplyTimedLife(dummy, 'BTLF', 0.45)
        call UnitAddAbility(dummy,spell)
        call UnitAddAbility(dummy,'Aloc')
        call SetUnitAbilityLevel(dummy,spell,level)
        call SetUnitUserData(dummy,0)
        call SetUnitFlyHeight(dummy,0,0)
        call IssuePointOrder(dummy,order,x,y)
        call PauseUnit(dummy,false)
        set dummy = null
        set source = null
        set u = null
    endfunction
    
    function TargetCastLocEx takes unit source, real x, real y, integer spell, string order, real damage, attacktype Atype, damagetype Dtype, integer level, real range returns nothing
        local group g = CreateGroup()
        local unit enum
        local unit dummy = CreateUnit(GetOwningPlayer(source),DUMMY_UNITED,x,y,0.0)
        call UnitApplyTimedLife(dummy, 'BTLF', 0.45)
        call UnitAddAbility(dummy,spell)
        call UnitAddAbility(dummy,'Aloc')
        call SetUnitAbilityLevel(dummy,spell,level)
        call SetUnitUserData(dummy,0)
        call SetUnitFlyHeight(dummy,0,0)
        call IssuePointOrder(dummy,order,x,y)
        call PauseUnit(dummy,false)
        set u=source
        if damage ==0 then
             debug call BJDebugMsg("Can't cause damage to target!Please fix error at your trigger!May be real damage taken equal to 0!")
        endif
        call GroupEnumUnitsInRange(g,x,y,range,Condition(function Check))
        loop
            set enum = FirstOfGroup(g)
            exitwhen (enum==null)
            call GroupRemoveUnit(g,enum)
            call UnitDamageTarget(source,enum,damage,false,false,Atype,Dtype,null)
        endloop
        set dummy = null
        set source = null
        set enum = null
        set u = null
        call GroupClear(g)
        call DestroyGroup(g)
    endfunction
    
    endlibrary
    Rất đơn giản để sử dụng!Chỉ cần dùng lệnh:
    TargetCast(người dùng,mục tiêu,chỉ số code kỹ năng,lệnh sử dụng,cấp độ)
    Chúc các bạn có thể dùng tốt với trigger của mình!:)
     
  2. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    tại sao phải dùng cái này thay vì dùng xe?

    xe còn có cả "recycle" dummy
    cái này tạo dummy rồi add expiration timer (create/remove) -> không hiệu quả

    >call UnitAddAbility(dummy,'Aloc')

    dummy không có sẵn 'Aloc' ? có sẵn thì sao mà phải add?

    >call SetUnitUserData(dummy,0)

    sau khi create thì UserData bằng 0 sẵn rồi, việc gì phải đặt? mà nếu UserData khác 0 thì có vấn đề gì?

    >call PauseUnit(dummy,false)

    dòng này để làm gì? nếu sợ lúc issue order, dummy bị pause thì phải un-pause trước dòng "call Issue..." chứ?

    >if (GetUnitAbilityLevel(target,imID) > 0) then
    > debug call BJDebugMsg("Can't cast ability to this target!May be this target resist this spell!Unit: "+GetUnitName(target))
    > endif


    nếu chỉ có 1 dòng "debug" ở trong if thì cả 3 dòng trên nên là debug
    không ở debug mode: kiểm tra điều kiện xong không làm gì thì có cần thiết kiểm tra?

    ngoài ra cái if này khá riêng biệt (specific) cho một mục đích nào đó, tôi cảm thấy ko cần thiết
     
  3. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Nhưng có một số lỗi mà xecast không hề dùng spell khi ra lệnh!Điển hình là mình!OrderId("thunderbolt") dùng cho nó rồi nhưng vẫn ko thực hiện lệnh!
    Thêm nữa là một số bạn không biết chỉnh sửa dummy vẫn có thể bị lỗi,cần setUserData!
     
    Chỉnh sửa cuối: 28/4/11
  4. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    >Nhưng có một số lỗi mà xecast không hề dùng spell khi ra lệnh!Điển hình là mình!OrderId("thunderbolt") dùng cho nó rồi nhưng vẫn ko thực hiện lệnh!

    bạn nói thế nào ấy chứ tớ dùng orderid của thunderbolt mãi có sao đâu
    Mã:
    set xc = xecast.createBasicA( 'AHtb', 852095 ,Player(15)) // 852095 = order id thunderbolt
    call xc.castOnTarget( u )
    
    >Thêm nữa là một số bạn không biết chỉnh sửa dummy vẫn có thể bị lỗi,cần setUserData!

    tôi ko nghĩ với dummy vừa tạo ra có thể gây lỗi gì 8-|
     
  5. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    >Nhưng có một số lỗi mà xecast không hề dùng spell khi ra lệnh!Điển hình là mình!OrderId("thunderbolt") dùng cho nó rồi nhưng vẫn ko thực hiện lệnh!

    bạn nói thế nào ấy chứ tớ dùng orderid của thunderbolt mãi có sao đâu
    Mã:
    set xc = xecast.createBasicA( 'AHtb', 852095 ,Player(15)) // 852095 = order id thunderbolt
    call xc.castOnTarget( u )
    
    >Thêm nữa là một số bạn không biết chỉnh sửa dummy vẫn có thể bị lỗi,cần setUserData!

    tôi ko nghĩ với dummy vừa tạo ra có thể gây lỗi gì 8-|
     
  6. vuongkkk

    vuongkkk T.E.T.Я.I.S

    Tham gia ngày:
    22/5/10
    Bài viết:
    588
    Nơi ở:
    Hà Nội
    Mình cùng từng gặp lỗi như bạn khi dùng xecast system, nhưng giờ mình đã sửa được.
    Thực ra lỗi ko phải tại xecasttại dùng các system khác có sử dụng hàm SetUnitUserData như AIDS hay AutoIndex thì mới bị như vậy. Bạn thử coi lại các system của bạn đi, còn xecast hoạt động rất tốt.
    Khuyên các bạn muốn dùng dummy cast spell thì nên dùng xecast của Vex và cách dùng tự mình nhận thấy là rất đơn giản và hiệu quả với recycle dummy.

    Nếu bạn AzuhaSky nghi ngờ thì thử tạo 1 map riêng chỉ dùng mỗi xecast để thử. Chắc chắn chạy. Không thì bạn dùng sai
     
    Chỉnh sửa cuối: 28/4/11
  7. BlackWings

    BlackWings Youtube Master Race

    Tham gia ngày:
    5/2/11
    Bài viết:
    57
    cho hỏi cái system dùng làm gì vậy? :(
     
  8. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Nhưng lỡ một số bạn sử dụng AutoIndex thì thế nào?Mình viết system để phòng hờ trường hợp này!Vả lại mới học!
     
  9. vuongkkk

    vuongkkk T.E.T.Я.I.S

    Tham gia ngày:
    22/5/10
    Bài viết:
    588
    Nơi ở:
    Hà Nội
    Hỏi thế thì chịu. Mỗi system có 1 tác dụng. Nó giúp người làm map làm map nhanh hơn hiệu quả hơn.
    Như cái xecast là dùng dummy cast spell, dummy ko phải là cứ tạo rồi kill, nếu cast nhìu lần trong 1 thời gian nhỏ với kiểu đó thì cực lag. Và dùng xecast sẽ hạn chế điều này.
     
  10. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Cũng may!Mình còn UnitsClear system nên không bị lag!
     
  11. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    người sử dụng AutoIndex và AIDS phải biết lọc unit nào cần index và unit nào không cần bạn chỉ cần chỉ ra dummy unit của mình, người ta dùng khắc biết

    hơn nữa, nếu các dummy của bạn đc index mà bạn SetUnitUserData như vậy sẽ gây lỗi cho các system index trên

    UnitsClear?
     
    Chỉnh sửa cuối: 28/4/11
  12. Diệp Thanh

    Diệp Thanh Kirin Tor Moderator Lão Làng GVN

    Tham gia ngày:
    7/2/04
    Bài viết:
    4,030
    Đã chơi VJass mà dùng cách này thấy hơi thủ công :bz
     
  13. vuongkkk

    vuongkkk T.E.T.Я.I.S

    Tham gia ngày:
    22/5/10
    Bài viết:
    588
    Nơi ở:
    Hà Nội
    Anh Tom nói hết rồi nhưng mình vẫn muốn nói chi tiết hơn là các unit không cần đánh index ở đây chính là những dummy làm eff và cast spell hộ
     
  14. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Vậy AutoIndex để làm gì,chức năng thế nào!Mình mới học nên còn dở mấy cái này!Chủ yếu học xe thôi!
     
  15. Diệp Thanh

    Diệp Thanh Kirin Tor Moderator Lão Làng GVN

    Tham gia ngày:
    7/2/04
    Bài viết:
    4,030
    Never heard of it :bz
     
  16. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Well?!That is my system!It can clears some died units!Therefore,leak in map will remove!
     
    Chỉnh sửa cuối: 29/4/11

Chia sẻ trang này