Topic hỏi đáp về cách làm map | version 9

Status
Không mở trả lời sau này.
Nói chung cách làm trigg Revive cũng như nhau thôi! :-j Cần gì mọc moi map người ta để xem chứ?
Nói chung cứ đặt condition thì việc đặt cách mấy em khác không cần chi cho ram!
Trừ khi việc cậu Regist action của một trigger nào đó sang trigger Generic unit events này thôi!;))

Góp ý là lần sau đừng bôi trắng nội dung thế nữa nhé, mãi mới nhìn ra... cái này mình cũng mới chỉ thắc mắc thôi chứ ko chắc chắn. Mình có thói xấu là code cái gì cũng đều muốn tối ưu hóa tốc độ một cách tổi đa, mặc dù ko đáng kể
 
Cậu tối ưu hoá thì cũng vừa vừa, tính thử xem mỗi lần cậu sử dụng special unit events như vậy thì tốn bao nhiêu trigg cho hàng trăm unit?
Tốn trigger cũng tốn tí ram vậy?- Còn nặng map nữa!;))
 
mình toàn dùng Event generic unit để tạo spell :) Còn specific chưa dùng bao h vì mình biết con nào vs con nào mà chọn.Mở cái máp đua xe của Blizzard mới biết trình độ viết spell của nó đỉnh như thế nào :-s.
Cho mình hỏi làm sao để check 1 unit đã đi được bao nhiêu quãng đường
VD: Cứ chạy được 1k range thì hồi 10 hp.
 
đặt condition thì ram cái gì?

condition cũng là handle, có nó thì vẫn tốn RAM (tất nhiên là ít)

theo mình hiểu thì generic nó sẽ đăng kí cho toàn bộ unit trong map... vì vậy tránh sử dụng generic event để giảm lãng phí ram không cần thiết???

bạn sai rồi, generic event đăng ký event cho toàn bộ player, mỗi generic event thì sử dụng 16 handle (tương đương với 16 player).
nói cho chính xác generic event là nhiều "player-owned unit event"

nếu dùng specific event, unit nào cần thì phải đăng ký, mỗi lần dùng 1 handle, mà khi không dùng nữa mà ko xóa thì sẽ leak. Và tôi nói thật, không có cách xóa event đâu =)), trừ phi xóa trigger
specific event thường đi với "dynamic trigger" (trigger động, nghĩa là trigger được tạo ra khi đang chơi), mà cái này dùng ko cẩn thận sẽ gây lỗi nghiêm trọng. (bạn search trên wc3c.net mà đọc)

như goldviper nói ở trên, sao biết unit nào cần event mà đăng ký? đăng ký cho tất cả các unit thì còn tốn hơn generic event =))

Cho hỏi cái snippet này phần filter là gì ??
Snippet GetClosetUnit: Đây

filter là một "hàm điều kiện" (condition function) mà takes nothing returns boolean

ví dụ:
Mã:
function SpellFilter takes nothing returns boolean
    return GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE) / GetUnitState(GetFilterUnit(),UNIT_STATE_MAX_LIFE)<=0.5 
endfunction

function MySpell takes nothing returns nothing
     local unit u = GetClosestUnit( x, y, Condition( function SpellFilter )) //unit gần nhất và có máu <= 50%
endfunction

GetFilterUnit() là "Matching Unit" trong GUI
 
Chỉnh sửa cuối:
anh Tom cho em hỏi sao lại em thay chữ normal bằng chữ spell trong action này thì nó báo lỗi :
Mã:
Custom script:   call UnitDamageTarget( udg_SlayerCaster, udg_PickedUnit[1], udg_SlayerReal[2], false, true, ATTACK_TYPE_[B]SPELL[/B], DAMAGE_TYPE_NORMAL, null )
Chẳng nhẽ chỉ deal dam norlmal được thui sao :-s
Mark.jpg
 
condition cũng là handle, có nó thì vẫn tốn RAM (tất nhiên là ít)



bạn sai rồi, generic event đăng ký event cho toàn bộ player, mỗi generic event thì sử dụng 16 handle (tương đương với 16 player).
nói cho chính xác generic event là nhiều "player-owned unit event"

nếu dùng specific event, unit nào cần thì phải đăng ký, mỗi lần dùng 1 handle, mà khi không dùng nữa mà ko xóa thì sẽ leak. Và tôi nói thật, không có cách xóa event đâu =)), trừ phi xóa trigger
specific event thường đi với "dynamic trigger" (trigger động, nghĩa là trigger được tạo ra khi đang chơi), mà cái này dùng ko cẩn thận sẽ gây lỗi nghiêm trọng. (bạn search trên wc3c.net mà đọc)

như goldviper nói ở trên, sao biết unit nào cần event mà đăng ký? đăng ký cho tất cả các unit thì còn tốn hơn generic event =))

Tất nhiên là nếu ko biết rõ cần kiểm tra unit nào thì chẳng ai dùng specific. Ngược lại nếu chỉ theo dõi 1, 2 unit mà dùng generic event thì chả khác nào... giết gà dùng dao mổ trâu. Về vụ 16 handle bạn nhắc đến có thể cho mình cái link xác thực đc ko, handle này là gì? (trigger?)

Sau đây là 1 đoạn code viết bởi jesus4lyf bên The helper:
Mã:
struct FootmanGuardians extends array
    //! runtextmacro AIDS()
    // Footmen
    private unit a
    private unit b
    private trigger t
    
    private static method OnDamage takes nothing returns boolean
        // Forwards damage as pure damage.
        local thistype d=thistype[GetTriggerUnit()]
        call UnitDamageTargetBJ( GetEventDamageSource(), d.a, GetEventDamage(), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
        call UnitDamageTargetBJ( GetEventDamageSource(), d.b, GetEventDamage(), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
        return false
    endmethod
    
    private static method AIDS_filter takes unit u returns boolean
        return GetUnitTypeId(u)!='hfoo' // Don't make this struct for footmen.
    endmethod
    private method AIDS_onCreate takes nothing returns nothing
        set this.a=CreateUnit(Player(0),'hfoo',GetUnitX(this.unit),GetUnitY(this.unit),0)
        set this.b=CreateUnit(Player(0),'hfoo',GetUnitX(this.unit),GetUnitY(this.unit),0)
        
        set this.t=CreateTrigger()
        call TriggerAddCondition(this.t,Condition(function thistype.OnDamage))
        call TriggerRegisterUnitEvent(this.t,this.unit, EVENT_UNIT_DAMAGED )
    endmethod
    private method AIDS_onDestroy takes nothing returns nothing
        call DestroyTrigger(this.t)
        set this.t=null
        call RemoveUnit(this.a)
        call RemoveUnit(this.b)
        set this.a=null
        set this.b=null
    endmethod
endstruct

Đây là trường hợp tiêu biểu cho việc sử dụng specific event thay vì generic. Theo Tom thì có leak chỗ nào ko?
 
Mã:
struct FootmanGuardians extends array
    //! runtextmacro AIDS()
    // Footmen
    private unit a
    private unit b
    private trigger t
    
    private static method OnDamage takes nothing returns boolean
        // Forwards damage as pure damage.
        local thistype d=thistype[GetTriggerUnit()]
        call UnitDamageTargetBJ( GetEventDamageSource(), d.a, GetEventDamage(), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
        call UnitDamageTargetBJ( GetEventDamageSource(), d.b, GetEventDamage(), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
        return false
    endmethod
    
    private static method AIDS_filter takes unit u returns boolean
        return GetUnitTypeId(u)!='hfoo' // Don't make this struct for footmen.
    endmethod
    private method AIDS_onCreate takes nothing returns nothing
        set this.a=CreateUnit(Player(0),'hfoo',GetUnitX(this.unit),GetUnitY(this.unit),0)
        set this.b=CreateUnit(Player(0),'hfoo',GetUnitX(this.unit),GetUnitY(this.unit),0)
        
        set this.t=CreateTrigger()
        call TriggerAddCondition(this.t,Condition(function thistype.OnDamage))
        call TriggerRegisterUnitEvent(this.t,this.unit, EVENT_UNIT_DAMAGED )
    endmethod
    private method AIDS_onDestroy takes nothing returns nothing
        call DestroyTrigger(this.t)
        set this.t=null
        call RemoveUnit(this.a)
        call RemoveUnit(this.b)
        set this.a=null
        set this.b=null
    endmethod
endstruct

Đây là trường hợp tiêu biểu cho việc sử dụng specific event thay vì generic. Theo Tom thì có leak chỗ nào ko?

Trigger này được regist actions bởi một trigger khác đấy! Tất nhiên phải sử dụng hàm này cho các lệnh takes damage unit events!
Tuy nhiên việc sử dụng nó cũng bị giới hạn lệnh gọi!(Nói chung là khó biết lệnh nào hợp lệ!)
 
code của jesus4lyf trên thì ko leak, call DestroyTrigger(this.t) <-- xóa trigger đó

unit take damage thì rõ ràng phải dùng specific event rồi (làm gì có generic event cho unit takes damage), cái đó khỏi bàn :-j
---
tôi đồng ý là nếu dùng specific event sẽ tiết kiệm hơn generic event, tuy nhiên sẽ... phức tạp hơn

Tất nhiên là nếu ko biết rõ cần kiểm tra unit nào thì chẳng ai dùng specific. Ngược lại nếu chỉ theo dõi 1, 2 unit mà dùng generic event thì chả khác nào... giết gà dùng dao mổ trâu.

cho ví dụ đi?
ví dụ với 1 spell xem nào, thường thì:
Mã:
Cast Spell
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to Animate Dead
    Actions
        -------- cac actions --------

vậy dùng specific unit event thì phải làm thế nào?
---
handle là unit, trigger, event, triggeraction, location,...

Trigger này được regist actions bởi một trigger khác đấy! Tất nhiên phải sử dụng hàm này cho các lệnh takes damage unit events!

đọc cho kỹ, người ta dùng condition chứ không dùng action, và condition được đăng ký cho "trigger này" chứ không phải từ "trigger khác"
 
Chỉnh sửa cuối:
Quên mất! Nó = vjass !=))
Nhìn y như là các làm auto-cast của anh thoy!:-j (GetDamageSource())
 
code của jesus4lyf trên thì ko leak, call DestroyTrigger(this.t) <-- xóa trigger đó

unit take damage thì rõ ràng phải dùng specific event rồi (làm gì có generic event cho unit takes damage), cái đó khỏi bàn :-j
---
tôi đồng ý là nếu dùng specific event sẽ tiết kiệm hơn generic event, tuy nhiên sẽ... phức tạp hơn



cho ví dụ đi?
ví dụ với 1 spell xem nào, thường thì:
Mã:
Cast Spell
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to Animate Dead
    Actions
        -------- cac actions --------

vậy dùng specific unit event thì phải làm thế nào?
---
handle là unit, trigger, event, triggeraction, location,...

Nếu thik thì vẫn có thể dùng cái lib Damage của chính hắn ta, Reg 1 cái any unit dam event, nhưng hình như jesus đã tối ưu cái này, tức là bao nhiêu trigger cũng chỉ sử dụng chừng đấy handle mà thôi.

1 ví dụ khác cho việc nên sử dụng specific event:

Tạo 1 buff trên 1 unit, buff tác dụng trong 10 s, nếu unit đấy chết khi vẫn còn buff thì sẽ + cho Hero 1 lượng dam.
^ khi buff đc create, tạo 1 specific trigger unit death event, khi remove thì clear sạch tất cả những gì liên quan đến trigger
 
Tạo 1 buff trên 1 unit, buff tác dụng trong 10 s, nếu unit đấy chết khi vẫn còn buff thì sẽ + cho Hero 1 lượng dam.
^ khi buff đc create, tạo 1 specific trigger unit death event, khi remove thì clear sạch tất cả những gì liên quan đến trigger

Nói cách tốt nhất là tôi không biết! Tôi thường dùng ABuff system để thực hiện các việc đại loại như vậy nên cũng không biết vụ này lắm!Nói về việc này, cũng có thể dùng Generic events with conditions là ((Dying unit) has buff ABC) equal to true! Không quen sử dụng hàm trên cho lắm bởi tôi chưa phát hiện nhiều các nào MUI đối với Jass!
 
Nói cách tốt nhất là tôi không biết! Tôi thường dùng ABuff system để thực hiện các việc đại loại như vậy nên cũng không biết vụ này lắm!Nói về việc này, cũng có thể dùng Generic events with conditions là ((Dying unit) has buff ABC) equal to true! Không quen sử dụng hàm trên cho lắm bởi tôi chưa phát hiện nhiều các nào MUI đối với Jass!
Chính xác, đây là cách cổ điển nhất, tiện nhất nhưng cũng kém hiệu quả nhất...
Còn việc sử dụng Abuff tức là bạn đã đc hỗ trợ tận răng rồi. lúc này sử dụng specific event đơn giản cực kì :D
 
Chính xác, đây là cách cổ điển nhất, tiện nhất nhưng cũng kém hiệu quả nhất...
Còn việc sử dụng Abuff tức là bạn đã đc hỗ trợ tận răng rồi. lúc này sử dụng specific event đơn giản cực kì :D

Uhm! Quen vJass nên lấy nó làm bạn gái luôn!;))
Chứ giờ đây mấy vụ events tôi hơi dốt! Nhất là Unit - Life State Events!Chả biết làm sao để regist tất!
 
Lại bàn về Abuff, mình chưa xem kĩ source code của nó nhưng có thể hiểu là: bất cứ unit nào sở hữu 1 buff cũng đã đều đc đăng kí 1 số specific event nhất định: take dam, deal dam, death, cast spell... Nhưng tất nhiên sẽ rất ít khi mình sử dụng hết những event đó. bởi vậy nó sẽ chỉ đăng kí những event mình cần thôi (bằng cách kiểm tra xem mình sử dụng những hàm sự kiện nào: function Abuff_onTakeDam, Abuff_onCastSpell... etc mình nhớ mang máng thôi). Thực sự Abuff là 1 lib rất tuyệt vời... đúng như 1 thành viên nào đó trên wc3c nói: "1 khi bạn hiểu và quen với nó, bạn chẳng cần cái quái gì khác" =))
 
Em up pai này là bài thứ 3 rồi, em sợ mod baned quá !
em không biết cách để làm 1 item có abiliti allstar hay str,agi gì ấy + 30, +40 ( trong world editor chỉ số thấp quá à :( )
làm ơn giúp em với !!!
 
Cho em xin demo map spell Wild Axe ( giống 90% Dota, dealing 2 lần dame của 2 rìu lên và về - tức trigger slide rìu ko gây dame) Thanks trước các tiền bối.
P.s: @ phamthitoquyen, wang yahoo lên cần gì mình chỉ trên yahoo cho luôn
 
Cho em xin demo map spell Wild Axe ( giống 90% Dota, dealing 2 lần dame của 2 rìu lên và về - tức trigger slide rìu ko gây dame) Thanks trước các tiền bối.
P.s: @ phamthitoquyen, wang yahoo lên cần gì mình chỉ trên yahoo cho luôn

E hèm!:">
Nếu mà bạn giỏi vJass thì mình đưa nguyên site cho bạn coi code đó!
 
Status
Không mở trả lời sau này.
Back
Top