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

Thảo luận trong 'World Editor' bắt đầu bởi Tom_Kazansky, 22/3/11.

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

    zollback Youtube Master Race

    Tham gia ngày:
    16/5/10
    Bài viết:
    88
    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ể
     
  2. AzuhaSky

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

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    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!;))
     
  3. goldviper

    goldviper Mario & Luigi Lão Làng GVN

    Tham gia ngày:
    7/1/10
    Bài viết:
    747
    Nơi ở:
    Tổ dân phố
    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.
     
  4. ZhengHe

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

    Tham gia ngày:
    4/1/09
    Bài viết:
    623
    Cho hỏi cái snippet này phần filter là gì ??
    Snippet GetClosetUnit: Đây
     
  5. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    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 =))

    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: 2/6/11
  6. goldviper

    goldviper Mario & Luigi Lão Làng GVN

    Tham gia ngày:
    7/1/10
    Bài viết:
    747
    Nơi ở:
    Tổ dân phố
    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
     
  7. phamthuytoquyen

    phamthuytoquyen Youtube Master Race

    Tham gia ngày:
    23/3/07
    Bài viết:
    17
    Jup em với, em là lính mới : (
    yeu w3 lâu rồi nhưng h mới tập làm map...
     
  8. zollback

    zollback Youtube Master Race

    Tham gia ngày:
    16/5/10
    Bài viết:
    88
    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?
     
  9. AzuhaSky

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

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    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ệ!)
     
  10. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    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,...

    đọ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: 2/6/11
  11. AzuhaSky

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

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Quên mất! Nó = vjass !=))
    Nhìn y như là các làm auto-cast của anh thoy!:-j (GetDamageSource())
     
  12. zollback

    zollback Youtube Master Race

    Tham gia ngày:
    16/5/10
    Bài viết:
    88
    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
     
  13. AzuhaSky

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

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    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!
     
  14. zollback

    zollback Youtube Master Race

    Tham gia ngày:
    16/5/10
    Bài viết:
    88
    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
     
  15. AzuhaSky

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

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    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!
     
  16. zollback

    zollback Youtube Master Race

    Tham gia ngày:
    16/5/10
    Bài viết:
    88
    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" =))
     
  17. phamthuytoquyen

    phamthuytoquyen Youtube Master Race

    Tham gia ngày:
    23/3/07
    Bài viết:
    17
    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 !!!
     
  18. FlameDrake

    FlameDrake Dragon Quest

    Tham gia ngày:
    1/12/10
    Bài viết:
    1,298
    Nơi ở:
    Quận 10 HCM
    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
     
  19. AzuhaSky

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

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    E hèm!:">
    Nếu mà bạn giỏi vJass thì mình đưa nguyên site cho bạn coi code đó!
     
  20. FlameDrake

    FlameDrake Dragon Quest

    Tham gia ngày:
    1/12/10
    Bài viết:
    1,298
    Nơi ở:
    Quận 10 HCM
    Mình xin trigger tiền bối :| Cái đó ko biết chút gì :|
     
Trạng thái chủ đề:
Không mở trả lời sau này.

Chia sẻ trang này