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

Status
Không mở trả lời sau này.
Nguyên tắc cũng như Tuto của Tom thôi:
Event là khi 1 unit nhận damage (Nếu dùng VJass thì kiếm 1 cái damage detection system ko khó)
Điều kiện là unit nhận damage có buff của spell Auto-cast
Action thì tự biên tự diễn.

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:.
 
Có ai chỉ mình cách tính damage skill = attack base của Hero ko? Bằng trigger đó .. hic
 
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:.

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 :(
 
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 :(

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.
 

Attachments

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.
 

Attachments

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 ^^
 
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.

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:
 
Ai chỉ mình cách làm di chuyển = phím mà ko di chuyển = chuột được. thanks
 
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
 
Cụ thể là đi về hướng nào ???
 
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.
 
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ỉ ??
 
thì thêm điều kiện vào nếu damage taken < 10 thì sẽ không show damage ( hoặc = 0)
 
^
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:
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 ;))
 
Cụ thể là đi về hướng nào ???

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 ----------

^
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

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.
 
Venomous Gale GUI non-MUI :@)

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)
 
đượ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
 
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:
Status
Không mở trả lời sau này.
Back
Top