Topic hỏi đáp (tập 4) về cách làm map

Thảo luận trong 'World Editor' bắt đầu bởi Tom_Kazansky, 19/2/10.

Trạng thái chủ đề:
Không mở trả lời sau này.
  1. oaioaioi

    oaioaioi Donkey Kong

    Tham gia ngày:
    5/4/07
    Bài viết:
    341
    Nơi ở:
    Elgaill Town
    Mình ko hiểu lắm về điều kiện unit nhận damage có buff. Vì theo hướng dẫn của Tom thì spell Impetus deal thêm damage vào unit có dính buff của Impetus, còn spell Auto-cast dạng Missile này thì lại tạo 1 DummyMissile bắn vào unit mục tiêu nên nếu dùng điều kiện unit dính buff auto-cast cũng ko kích hoạt được spell này. Có điều kiện nào khác kích hoạt được trigger ví dụ như unit in range ko nhỉ :chicken:.
     
  2. MjnWu

    MjnWu Youtube Master Race

    Tham gia ngày:
    10/9/07
    Bài viết:
    98
    Nơi ở:
    BD
    Có ai chỉ mình cách tính damage skill = attack base của Hero ko? Bằng trigger đó .. hic
     
  3. KuKulKan

    KuKulKan T.E.T.Я.I.S

    Tham gia ngày:
    2/8/09
    Bài viết:
    629
    Nơi ở:
    Quận Thủ Đức, Thành phố Hồ Chí Minh
    Thật ra khi mình dùng Event - Unit take damage, thì phải add tất cả Unit vào, giả sử xài skill Impetus đi, nếu không có buff thì trong vô số Unit take damage đó biết con nào bị skill Impetus cast phải, đâm ra 1 là trigger bị lỗi, 2 là trigger không hoạt động. Vì vậy khi có buff, trigger sẽ hiểu con bị skill Impetus là con có buff, nên trigger sẽ hoạt đông được dựa trên unit có buff, còn mấy con kia không đúng điều kiện --> out hết

    Dùng dạng Misile, nếu unit không có buff, trigger không hiểu target là con nào trong vô vàn Unit Take Damage, vậy thì tạo Dumy bắn vào target nào ? --> điều kiện có buff là bắt buộc thui :D

    nói nhiều vậy hok bik bạn có hiểu hok :(
     
  4. oaioaioi

    oaioaioi Donkey Kong

    Tham gia ngày:
    5/4/07
    Bài viết:
    341
    Nơi ở:
    Elgaill Town
    Mình hiểu ý bạn, mình xem qua nhiều spell auto-cast hầu như tất cả đều dùng điều kiện UnitHasBuff. Chỉ có điều khi viết function điều kiện và set biến của spell cho phù hợp với hệ thống Missile trên vJass mình làm nhiều lần mà vẫn ko call được function.

    Do tiếp cận quá ít về Jass/vJass và chưa nắm được căn bản nên mình chưa hiểu rõ lắm về cách tạo function điều kiện và set biến để tạo spell hoạt động chính xác như ý muốn.

    Mình rất cần làm được 1 spell Auto Cast dựa trên hệ thống Missile này, loại spell này mình tìm kiếm đã lâu. Nếu mọi người có thể thì hãy giúp mình tạo 1 spell Auto Cast ứng dụng Missile System này, thật sự mình rất cảm ơn.

    Không biết có tài liệu nào giúp tìm hiểu về Jass/vJass từ căn bản đến nâng cao để có thể học hỏi ko. Không phải mình quá tự cao ko thèm dùng GUI nhưng thật sự Jass có nhiều cái hay nên học và sử dụng. I'm really a chiken guy.
    Đây là map Missile System đính kèm.
     

    Các file đính kèm:

  5. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    cái căn bản là call thế nào, như nói ở bài auto-cast, khi unit take dmg mà có buff là lúc skill auto-cast được dùng (và trúng), lúc đó thì gọi hàm tạo missile thôi có khó gì đâu 8-|

    trong map đã sửa (ở dưới), hero có auto-cast bắn ra missile lửa nổ.

    chú ý: trigger Show DamageAutoCast UnitTakedmg có thể merge.
     

    Các file đính kèm:

  6. nhoxwark12

    nhoxwark12 Youtube Master Race

    Tham gia ngày:
    10/4/10
    Bài viết:
    6
    mình không biết chỉnh nhạc nổi lên khi lúc nào mình muốn VD như trùm xuống đánh nhà mình nhạc tự nhiện co nhạc như map warcarf mà mình được nghe . nhạc mình có thể điều chỉnh đươc kok mấy bác chỉ em với no la triger a` hay trong world editor vậy ^^
     
  7. oaioaioi

    oaioaioi Donkey Kong

    Tham gia ngày:
    5/4/07
    Bài viết:
    341
    Nơi ở:
    Elgaill Town
    Thanks Tom. Quả thật kiến thức quá hạn hẹp nên nhiều điều mọi người thấy đơn giản mình lại thấy phức tạp :chicken:
     
  8. ZhengHe

    ZhengHe T.E.T.Я.I.S

    Tham gia ngày:
    4/1/09
    Bài viết:
    623
    Ai chỉ mình cách làm di chuyển = phím mà ko di chuyển = chuột được. thanks
     
  9. Stork[gm]

    Stork[gm] Donkey Kong

    Tham gia ngày:
    29/5/09
    Bài viết:
    438
    Nơi ở:
    서울한국
    mình hỏi cái này: ví dụ khi cast 1 spell ( vào target point) thì muốn create 1 con unit đi 650 range(cast ở vị trí nào cũng đi 650 range) xong rồi pick tất cả các unit nằm trong 225 và cast storm bolt thì làm triggers thế nào
     
  10. raivor

    raivor Dragon Quest Lão Làng GVN

    Tham gia ngày:
    24/7/09
    Bài viết:
    1,411
    Cụ thể là đi về hướng nào ???
     
  11. ZhengHe

    ZhengHe T.E.T.Я.I.S

    Tham gia ngày:
    4/1/09
    Bài viết:
    623
    Giống kiểu arrow của Potm trong Dota nhưng chỉ 650 range rồi thêm pick unit group thôi.
    Dùng cái slide unit của anh Tom: khi start effect of ability thì creat dummy rồi cho nó slide. Khi dummy di đủ 650 range thì bỏ con cũ đi tạo thêm 1 dummy mới ko model rồi pick unit xung quanh dummy thứ 2 với range là 225, thêm tùm lum tá lả nữa là xong.

    Ai chỉ em cách làm di chuyển = phím và ko thể di chuyển = click chuột.
     
  12. protectq2007

    protectq2007 Donkey Kong

    Tham gia ngày:
    17/10/07
    Bài viết:
    378
    Sao cái trigger hiện damage mình làm thử thì lại có bug nhỉ, ví dụ như mình xài Cold Arrow thì khi dính buff ko gây damage nó vẫn hiện 0 liên tục, 1 số spell khác cũng bị tương tự :(
    Có cách nào để sửa không nhỉ ??
     
  13. KuKulKan

    KuKulKan T.E.T.Я.I.S

    Tham gia ngày:
    2/8/09
    Bài viết:
    629
    Nơi ở:
    Quận Thủ Đức, Thành phố Hồ Chí Minh
    thì thêm điều kiện vào nếu damage taken < 10 thì sẽ không show damage ( hoặc = 0)
     
  14. lucifekit

    lucifekit The Warrior of Light

    Tham gia ngày:
    25/2/06
    Bài viết:
    2,344
    ^
    Chuẩn!

    Arrow PotM thì dùng system xecollider trong bộ xecast ấy,dễ lắm. Khung của nó là tạo 1 cái struct có 3 cái event khi chạm unit,khi hết thời gian và khi dummy chết.Mình gắn tọa độ ban đầu cho cái arrow,khi nó gặp unit địch thì tính thời gian stun dựa trên khoảng cách từ vị trí hiện tại so với tọa độ ban đầu -->stun thời gian tùy ý.Xong rồi thích thì giết con dummy luôn hoặc cho nó chạy tiếp thì tùy :D.

    Biết cách dùng cái system này thật vô cùng tiện lợi :D

    Cấu trúc cho 1 dummy bay như sau :
    [spoil]
    Mã:
    private struct [B]Arrow[/B] extends xecollider //Muon sua arrow thanh ten gi cung dc
           unit owner      
           method [B]onUnitHit[/B] takes unit [B]target[/B] returns nothing
        //Su kien xay ra khi cham 1 unit khac(target)
           endmethod
           
           method [B]onDestroy[/B] takes nothing returns nothing
        //Su kien xay ra khi no bi tieu diet
               set this.owner = null 
           endmethod
           
           method [B]onExpire[/B] takes nothing returns nothing
        //Su kien xay ra khi het thoi gian
               call this.terminate() //-->dung de xoa cai cau truc nay cho do~ leak.
           endmethod
    endstruct
    
    [/spoil]

    Đầu tiên copy 4 cái trigger library Xe vào map,import model dummy vào,tạo 1 dummy với model đấy.Ấn ctrl D xem mã raw của dummy xong vào trigger xebasic sửa raw code dummy.

    Sau đó tạo 1 skill target point ví dụ dựa trên crushing wave chẳng hạn,sửa tên,tooltip,mana,cooldown.Ném nó cho con PotM.<A000>
    Tạo 1 skill stun cho dummy,xóa cái missile đi.<A001>

    Tạo 1 trigger :
    [spoil]
    Mã:
    Arrow
        Events
            Unit - A unit Starts the effect of an ability
        Conditions
            (Ability being cast) Equal to PotM Arrow 
        Actions
    
    [/spoil]
    Convert nó qua JASS,ta được :
    [spoil]
    Mã:
    function Trig_Arrow_Conditions takes nothing returns boolean
        if ( not ( GetSpellAbilityId() == 'A000' ) ) then
            return false
        endif
        return true
    endfunction
    
    function Trig_Arrow_Actions takes nothing returns nothing
    endfunction
    
    //===========================================================================
    function InitTrig_Arrow takes nothing returns nothing
        set gg_trg_Arrow = CreateTrigger(  )
        call TriggerRegisterAnyUnitEventBJ( gg_trg_Arrow, EVENT_PLAYER_UNIT_SPELL_EFFECT )
        call TriggerAddCondition( gg_trg_Arrow, Condition( function Trig_Arrow_Conditions ) )
        call TriggerAddAction( gg_trg_Arrow, function Trig_Arrow_Actions )
    endfunction
    
    
    [/spoil]
    Dán cái struct kia vào trigger,ta được :

    [spoil]
    Mã:
    function Trig_Arrow_Conditions takes nothing returns boolean
        if ( not ( GetSpellAbilityId() == 'A000' ) ) then
            return false
        endif
        return true
    endfunction
    
    [B]private struct Arrow extends xecollider
           unit owner      
          
           method onUnitHit takes unit target returns nothing
         
            endif
           endmethod
           
           method onDestroy takes nothing returns nothing
               set this.owner = null 
           endmethod
           
           method onExpire takes nothing returns nothing
               call this.terminate()
           endmethod
    endstruct[/B]
    
    function Trig_Arrow_Actions takes nothing returns nothing
    endfunction
    
    //===========================================================================
    function InitTrig_Arrow takes nothing returns nothing
        set gg_trg_Arrow = CreateTrigger(  )
        call TriggerRegisterAnyUnitEventBJ( gg_trg_Arrow, EVENT_PLAYER_UNIT_SPELL_EFFECT )
        call TriggerAddCondition( gg_trg_Arrow, Condition( function Trig_Arrow_Conditions ) )
        call TriggerAddAction( gg_trg_Arrow, function Trig_Arrow_Actions )
    endfunction
    
    
    [/spoil]

    Bây giờ sửa từng cái 1.
    Đầu tiên là sửa cái struct arrow.
    Thêm các biến sau vào
    location loc // -->luu vi tri arrow luc dau
    location loc2 //-->luu vi tri arrow luc cham target
    real khoangcach//-->tinh khoang cach 2 vi tri kia
    integer lv//-->Lv arrow
    integer lvstun //tinh lv cho stun skill

    Ở phần OnUnitHit mình sẽ tính lv cho skill stun của dummy như sau:
    //Điều kiện là nếu target là kẻ thù của chủ dummy và nó còn sống thì mới check
    if(IsUnitEnemy(target,GetOwningPlayer(owner)) and IsUnitAliveBJ(target))then
    set loc2=GetUnitLoc(target)//->lưu vị trí target
    set khoangcach = DistanceBetweenPoints(loc,loc2)//-->tính khoảng cách giữa 2 điểm
    set lvstun = R2I(khoangcach/100)//tính lv stun dựa trên khoảng cách,R2I để convert 1 số Real qua Integer.

    endif

    Giờ struct của ta đã thành :
    [spoil]
    Mã:
    private struct Arrow extends xecollider
           unit owner      
           location loc // -->luu vi tri arrow luc dau
           location loc2 //-->luu vi tri arrow luc cham target
           real khoangcach//-->tinh khoang cach 2 vi tri kia
           integer lv//-->Lv arrow
           integer lvstun //tinh lv cho stun skill 
           method onUnitHit takes unit target returns nothing
            if(IsUnitEnemy(target,GetOwningPlayer(owner)) and IsUnitAliveBJ(target))then
                set loc2=GetUnitLoc(target)
                set khoangcach = DistanceBetweenPoints(loc,loc2)
                set lvstun = R2I(khoangcach/100)//vi du neu cu 100 range tang lv stun len 1         
    //neu lv >10 thi set no = 10,vi stun co 10 level
        if(lvstun>10) then
                    set lvstun =10
                endif
                
            endif
           endmethod
           
           method onDestroy takes nothing returns nothing
               set this.owner = null 
           endmethod
           
           method onExpire takes nothing returns nothing
               call this.terminate()
           endmethod
    endstruct
    
    
    
    [/spoil]
    Bây h để cho dummy cast stun vào target,với ai ko biết JASS thì làm như sau
    Tạo 1 trigger mới :
    [spoil]
    Mã:
    Untitled Trigger 001
        Events
        Conditions
        Actions
            Unit - Create 1 Dummy Unit for (Owner of (Triggering unit)) at (Center of (Playable map area)) facing Default building facing degrees
            Unit - Add a 2.00 second Generic expiration timer to (Last created unit)
            Unit - Add Storm Bolt to (Last created unit)
            Unit - Set level of Storm Bolt for (Last created unit) to 1
            Unit - Order (Last created unit) to Human Mountain King - Storm Bolt (Last created unit)
            Unit - Cause (Triggering unit) to damage (Triggering unit), dealing 500.00 damage of attack type Spells and damage type Universal
    
    [/spoil]

    Convert nó qua jass dán vào phần OnUnitHit .
    [spoil]
    Mã:
    call CreateNUnitsAtLoc( 1, 'n000', GetOwningPlayer(GetTriggerUnit()), GetRectCenter(GetPlayableMapRect()), bj_UNIT_FACING )
    call UnitApplyTimedLifeBJ( 2.00, 'BTLF', GetLastCreatedUnit() )
    call UnitAddAbilityBJ( 'AHtb', GetLastCreatedUnit() )
    call SetUnitAbilityLevelSwapped( 'AHtb', GetLastCreatedUnit(), 1 )
    call IssueTargetOrderBJ( GetLastCreatedUnit(), "thunderbolt", GetLastCreatedUnit() )
    call UnitDamageTargetBJ( GetTriggerUnit(), GetTriggerUnit(), 500, ATTACK_TYPE_NORMAL,DAMAGE_TYPE_UNIVERSAL )
    
    [/spoil]

    Sửa : GetTriggerUnit() -->owner(chủ dummy)
    Sửa : GetRectCenter(GetPlayableMapRect()) -->loc2-->vị trí target
    AHtb->Sửa thành rawcode của skill stun của dummy,ví dụ ở demo map là A001 đó.
    Sửa cái số 1 ở dòng set level -> lvstun
    Sửa GetLastCreatedUnit() ở sau thành target.
    Sửa dòng damage thành :
    call UnitDamageTargetBJ( owner,target,75*lv, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
    Nghĩa là cho owner damage target với sát thương 75 điểm mỗi level
    Remove leak,ta được struct hoàn chỉnh:

    [spoil]
    Mã:
    
    private struct Arrow extends xecollider
           unit owner      
           location loc // -->luu vi tri arrow luc dau
           location loc2 //-->luu vi tri arrow luc cham target
           real khoangcach//-->tinh khoang cach 2 vi tri kia
           integer lv//-->Lv arrow
           integer lvstun //tinh lv cho stun skill 
           method onUnitHit takes unit target returns nothing
            if(IsUnitEnemy(target,GetOwningPlayer(owner)) and IsUnitAliveBJ(target))then
                set loc2=GetUnitLoc(target)
                set khoangcach = DistanceBetweenPoints(loc,loc2)
                set lvstun = R2I(khoangcach/100)//vi du neu cu 100 range tang lv stun len 1   
       if(lvstun>10) then
                    set lvstun =10
                endif
                call CreateNUnitsAtLoc( 1, 'n000', GetOwningPlayer(owner), loc2, bj_UNIT_FACING )
                call UnitApplyTimedLifeBJ( 2.00, 'BTLF', GetLastCreatedUnit() )
                call UnitAddAbilityBJ( 'A001', GetLastCreatedUnit() )
                call SetUnitAbilityLevelSwapped( 'A001', GetLastCreatedUnit(), lvstun )
                call IssueTargetOrderBJ( GetLastCreatedUnit(), "thunderbolt", target )
                call UnitDamageTarget(owner,target,lv*75, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
                call RemoveLocation(loc2)
                set loc2 = null
                
            endif
           endmethod
           
           method onDestroy takes nothing returns nothing
               set this.owner = null 
           endmethod
           
           method onExpire takes nothing returns nothing
               call this.terminate()
           endmethod
    endstruct
    
    [/spoil]
    Cuối cùng ở phần action ta tạo con dummy đó như sau :

    [spoil]
    Mã:
    local location loc = GetUnitLoc(GetTriggerUnit()) //-->Lay vi tri cua PotM
    local location loc2 =GetSpellTargetLoc()//-->Lay vi tri cast spell
    local real ang = AngleBetweenPoints(loc,loc2)//-->Lay huong bay cho arrow
    local integer lv = GetUnitAbilityLevel(GetTriggerUnit(),'A000')//lay level skill arrow
    local Arrow fx//bien thuoc kieu arrow o tren,ten la fx
      
                set fx = Arrow.create(GetLocationX(loc), GetLocationY(loc), Deg2Rad(ang))
                //tao 1 cai arrow o vi tri X,Y,quay ve phia' ang
                //o day la vi tri cua potm,huong quay ve vi tri cast spell
                set fx.fxpath           = "Abilities\\Weapons\\Arrow\\ArrowMissile.mdl"
                //model cho dummy,nam trong 2 dau "" ,nho la duong dan thi phai 2 dau \\
                set fx.z=50.
                //do cao dummy
                set fx.speed            = 700
                //toc do dummy
                set fx.scale            = 2
                //phong to dummy bao nhieu lan
                set fx.expirationTime   = 2
                //dummy bay bao lau thi chet
                set fx.owner            = GetTriggerUnit()
                //chu cua dummy la ai?
                set fx.loc              = loc
                // bien nay moi tao them o tren,dung de luu vi tri arrow luc dau do'
                set fx.lv   = lv
                //luu lv skill arrow
    //Remove Leak
    call RemoveLocation(loc)
    set loc = null
    call RemoveLocation(loc2)
    set loc2 = null
    
    [/spoil]

    Xong,giờ thử sửa cast back wing + cast point của heroes về 0 xem cast liên tục có lag ko :D

    Demo map :
    http://www.mediafire.com/?cvluydtmmi0
     
    Chỉnh sửa cuối: 17/6/10
  15. protectq2007

    protectq2007 Donkey Kong

    Tham gia ngày:
    17/10/07
    Bài viết:
    378
    Ai cho mình xin cái Sytem gọi đệ chạy theo mình với tự động đánh quái, xài spell được không ?? Cái hôm trước a REX post link die rồi :(
    Ah cho xin luôn cái bảng code màu trong WE nha, ko phải code màu của a Tom post ;))
     
  16. Stork[gm]

    Stork[gm] Donkey Kong

    Tham gia ngày:
    29/5/09
    Bài viết:
    438
    Nơi ở:
    서울한국
    cụ thể là đi hướng trước mặt (mặt của con dummy facing với chỗ bị cast vào)

    ---------- Post added at 14:23 ---------- Previous post was at 14:18 ----------

    cái này có đến 6 triggers và hơi phức tạp 1 chút vì mình rất ngu in GUI. nhưng spell cụ thể mình muốn làm là Venomous Gale.
     
  17. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    Venomous Gale GUI non-MUI :@)
     

    Các file đính kèm:

  18. Stork[gm]

    Stork[gm] Donkey Kong

    Tham gia ngày:
    29/5/09
    Bài viết:
    438
    Nơi ở:
    서울한국
    cho mình hỏi cái này trước: nếu mình set thế này và đặt là every 0.01 seconds thì có ok ko?
    Set VenomousGale_Tick = 80
    Set TempLoc2 = (TempLoc offset by 10.00 towards VenomousGale_Angle degrees)
     
  19. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    được NHƯNG không nên

    every 0.04 là đủ, cùng lắm chỉ dùng every 0.025 thôi, dùng 0.01 sẽ gây lag không cần thiết
     
  20. Stork[gm]

    Stork[gm] Donkey Kong

    Tham gia ngày:
    29/5/09
    Bài viết:
    438
    Nơi ở:
    서울한국
    mình còn 1 câu hỏi nữa: nếu muốn làm unit throw (đi xuyên giống CoD của Bara xuyên cả địa hình và destructible) thì phải có skill hay triggers gì?
     
    Chỉnh sửa cuối: 17/6/10
Trạng thái chủ đề:
Không mở trả lời sau này.

Chia sẻ trang này