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

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

  1. Ăn xong dong

    Ăn xong dong Mr & Ms Pac-Man

    Tham gia ngày:
    7/6/11
    Bài viết:
    136
    Này sai chổ nào vậy mấy bác :(
    PHP:
    function Trig_Holy_Light_Conditions takes nothing returns boolean
        
    return GetSpellAbilityId() == 'A006'        
    endfunction
           
    function Trig_Holy_Light_Func004002003001 takes nothing returns boolean
        
    return ( IsUnitEnemy(GetFilterUnit(), pc) == true )
    endfunction

    function Trig_Holy_Light_Func004002003002001 takes nothing returns boolean
        
    return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) != true )
    endfunction

    function Trig_Holy_Light_Func004002003002002 takes nothing returns boolean
        
    return ( IsUnitAliveBJ(GetFilterUnit()) == true )
    endfunction

    function Trig_Holy_Light_Func004002003002 takes nothing returns boolean
        
    return GetBooleanAndTrig_Holy_Light_Func004002003002001(), Trig_Holy_Light_Func004002003002002() )
    endfunction

    function Trig_Holy_Light_Func004002003 takes nothing returns boolean
        
    return GetBooleanAndTrig_Holy_Light_Func004002003001(), Trig_Holy_Light_Func004002003002() )
    endfunction

    function Trig_Holy_Light_Actions takes nothing returns nothing
        local unit c 
    GetTriggerUnit()
        
    local player pc GetOwningPlayer(c)
        
    local unit t GetSpellTargetUnit()
        
    local location tp GetUnitLoc(t)
        
    local group ug
        local unit 
    pu
        local effect 
    e
        local integer i 
    = ( GetUnitAbilityLevel(c'A006' ) * 50 ) + 100
        local real r 
    I2R(i)
        
        
    call SetUnitLifeBJt, ( GetUnitState(tUNIT_STATE_LIFE) + ) )
        
    set ug GetUnitsInRangeOfLocMatching(200.00tpCondition(function Trig_Holy_Light_Func004002003))
        
        
    loop                              
            set pu 
    FirstOfGroup(ug)
            
    exitwhen pu == null
            call GroupRemoveUnit
    (ugpu)     
            
    call UnitDamageTargetcpurfalsetrueATTACK_TYPE_HERODAMAGE_TYPE_UNIVERSALWEAPON_TYPE_AXE_MEDIUM_CHOP )
            
    set e AddSpecialEffectTargetUnitBJ("origin"pu"Abilities\\Spells\\Items\\StaffOfPurification\\PurificationCaster.mdl" )
            
    call DestroyEffect)
        
    endloop
        
        set c 
    null
        set p 
    null
        set t 
    null
        call DestroyGroup 
    ug )
        
    call RemoveLocationtp )
        
    set pu null
        set e 
    null
        set i 
    0
        set r 
    0
    endfunction

    //===========================================================================
    function InitTrig_Holy_Light takes nothing returns nothing
        set gg_trg_Holy_Light 
    CreateTrigger(  )
        
    call TriggerRegisterAnyUnitEventBJgg_trg_Holy_LightEVENT_PLAYER_UNIT_SPELL_EFFECT )
        
    call TriggerAddConditiongg_trg_Holy_LightCondition( function Trig_Holy_Light_Conditions ) )
        
    call TriggerAddActiongg_trg_Holy_Light, function Trig_Holy_Light_Actions )
    endfunction
     
  2. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    call SetUnitScale(unit, scaleX, scaleY, scaleZ) là làm to nhỏ unit, chứ còn cái "lùn" kia là nhờ model. trong model đã có phần mình để ý có 1 node gắn kết Sprite First Ref dành cho skill gồm cả Impale,Tornado Spin,Cyclone, đó là chỉ rằng chỉ cần thay đổi effect "buff" giữa mấy skill đó là có thể thấy model nó bị "lùn" vậy :|

    cái đó chỉ là can thiệp của model thôi :|


    tớ hok có bắt bẻ là sự thật mà :( nó không khác gì gọi 2 cái var array cả :-ss chứ nó chậm 60% là coi như nhanh hơn 60% của 2 var array rồi :-"

    phần khai báo cực bộ(local) đã là 1 cái sai :-? vì đó chỉ tạo ra var tồn tại trong 1 func trong khi cái Trig_Holy_Light_Func00xxxx là chắc chắn không nhận được var đó rồi. trừ khi làm 1 var globals ví dụ globals
    player pc = null
    endglobals


    và mình nói thật nhé cái phần code đó cho dù chuyển qua jass thì nó vẫn là handle và leak như GUI thôi. tại vì "cách viết" nó không khác vs GUI. à phải nói là giống 100% chứ :|
     
  3. Ăn xong dong

    Ăn xong dong Mr & Ms Pac-Man

    Tham gia ngày:
    7/6/11
    Bài viết:
    136
    ^ Thế phải viết sao đây dh-g :( đang tập tành làm spell = jass (sau đó chuyển qua vjass) :((
     
  4. magicz123

    magicz123 Mr & Ms Pac-Man Lão Làng GVN

    Tham gia ngày:
    31/5/07
    Bài viết:
    185
    Một số phần không cần xài biến, dùng GetTriggerUnit() ví dụ đoạn có return ( IsUnitEnemy(GetFilterUnit(), pc) == true ) ở function khác thì thay vào là GetOwningPlayer(GetTriggerUnit())

    Biến local chỉ có hiệu ở chính function mình local abcxyz nó, trong vJass nó có globals / endglobals để khai báo biến global cho nhanh,, thật ra hạn chế, mình không hay xài lắm vì nó tạo ra cả đống biến globals udg_ rác nhớ mấy cái giá trị vớ vẩn như rawcode.. không cần thiết, thấy tác dụng duy nhất là đẹp code.

    Để gắn kết giữa các function mà hiệu quả nhất là dùng với Timer ấy thì dùng Hashtable. Cách xài rất đơn giản thôi, tạo Hashtable, vài 3 cái cũng đựoc rồi dùng SaveHandlexxx để ghi giá trị vào Hashtable, dùng lệnh LoadHandlexxx ở function khác gọi lại giá trị đó ra biến local khác, nó nhớ y hệt xài globals hoặc cave ấy, 1 con có thể cho nhiều thằng chơi.
     
    Chỉnh sửa cuối: 18/3/14
  5. babied

    babied Youtube Master Race

    Tham gia ngày:
    18/11/12
    Bài viết:
    67
    anh chỉ cho em cách can thiệp từ editor đi, làm thế nào để sử dụng node đó ạ.
    Nếu liên quan đến F6 thì em tìm không ra =.=!; doodad thì có thể kéo dãn theo trục Z mà sao unit, skill không được nhỉ, tương tự theo truc X, Y thì càng tốt ạ :D
     
  6. Ăn xong dong

    Ăn xong dong Mr & Ms Pac-Man

    Tham gia ngày:
    7/6/11
    Bài viết:
    136
    Tập tành làm vjass giúp spell này dùm e :( sai chổ nào ạ
    PHP:
    scope BladestormMix

    globals
        
    private integer abi 'A00I' // Bladestorm
    endglobals

    private function Conditions takes nothing returns boolean
        
    return GetSpellAbilityId() == abi
    endfunction

    private function Actions takes nothing returns nothing
        local unit c 
    GetSpellAbilityUnit()
        
    call SetUnitInvulnerablectrue )
        
    call TriggerSleepAction7.00 )    
        
    call SetUnitInvulnerablecfalse )
    endfunction

    //===========================================================================
    public function InitTrig takes nothing returns nothing
        local trigger trig 
    CreateTrigger(  )
        
        
    call TriggerRegisterAnyUnitEventBJtrigEVENT_PLAYER_UNIT_SPELL_CHANNEL )
        
    call TriggerAddActiontrig, function Actions )
        
    call TriggerAddCondition(trig,Condition(function Conditions))
    endfunction

    endscope
     
  7. magicz123

    magicz123 Mr & Ms Pac-Man Lão Làng GVN

    Tham gia ngày:
    31/5/07
    Bài viết:
    185
    Spell trên chuyển GetSpellAbilityUnit() thành GetTriggerUnit().
    Ngoài ra local c thì cuối cùng phải set c = null để không leak, TriggerSleepAction thì nên thay bằng PolledWait vì cái đó không chính xác bằng PolledWait.
     
  8. Hoài sơn Sky

    Hoài sơn Sky Youtube Master Race

    Tham gia ngày:
    9/3/11
    Bài viết:
    50
    Xin chào các bạn lâu lắm rồi mình không có làm maps h kiến thức rồi mọi thứ gần như là đã mất hết ai có thể giúp đỡ mình lại từ đầu k ...
     
  9. HiroshiKaze

    HiroshiKaze Youtube Master Race

    Tham gia ngày:
    19/8/12
    Bài viết:
    66
    Nơi ở:
    Tp.HCM
    Về PolledWait:
    TriggerSleepAction chính xác hơn PolledWait (xem code dưới, cái đó từ code nguồn của WE)
    TriggerSleepAction là làm trigger ngủ (không hoạt động)
    PolledWait cũng làm trigger ngủ nhưng nó check mỗi thời kì để thức và làm trigger liên tục, nhưng nó lại là 1 hàm BJ nên chạy chậm hơn thằng kia (native), cái nữa là nó gọi CreateTimer mỗi lần chạy rùi Destroy mà không set null nhá

    Mã:
    function PolledWait takes real duration returns nothing
        local timer t
        local real  timeRemaining
    
        if (duration > 0) then
            set t = CreateTimer()
            call TimerStart(t, duration, false, null)
            loop
                set timeRemaining = TimerGetRemaining(t)
                exitwhen timeRemaining <= 0
    
                // If we have a bit of time left, skip past 10% of the remaining
                // duration instead of checking every interval, to minimize the
                // polling on long waits.
                if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
                    call TriggerSleepAction(0.1 * timeRemaining)
                else
                    call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
                endif
            endloop
            call DestroyTimer(t)
        endif
    endfunction
    
    Về GetSpellAbilityUnit() thì không vấn đề gì cả, sao lại phải đổi GetTriggerUnit() nhỉ????
     
  10. Ăn xong dong

    Ăn xong dong Mr & Ms Pac-Man

    Tham gia ngày:
    7/6/11
    Bài viết:
    136
    Thật sự đã làm y chang những điều 2 bác dạy nhưng không biết sao mà lúc test map không được :( mình vào chơi map thì nó không chạy không load được map. Có vấn đề gì khác chăn :( tks
    p/s: làm spell vjass mệt quá ~.~
     
  11. HiroshiKaze

    HiroshiKaze Youtube Master Race

    Tham gia ngày:
    19/8/12
    Bài viết:
    66
    Nơi ở:
    Tp.HCM
    cho hỏi tại sao lại là: EVENT_PLAYER_UNIT_SPELL_CHANNEL

    đề nghị post yêu cầu lên, chứ quoăng code ra đó hỏi sai gì thì chỉ có thể chỉ sai cú pháp (nếu có) hay mí lỗi nên tránh v.v... chứ có biết yêu cầu là cái gì đâu?? Ở đây nhìn vào thấy SetInvul trong 7s nhưng event là cái chi chi là lại là SPELL_CHANNEL??? nếu là cast spell như trong GUI thì là SPELL_EFFECT
     
    Chỉnh sửa cuối: 19/3/14
  12. magicz123

    magicz123 Mr & Ms Pac-Man Lão Làng GVN

    Tham gia ngày:
    31/5/07
    Bài viết:
    185
    Đồng chí này dùng WE được bao nhiêu lâu rồi thế, bắt bẻ mình rất kinh mà íu có chính xác gì cả, thật sự là mình bàng hoàng luôn vì mớ kiến thức mình làm map từ hồi Vexorian còn active mà như bạn nói thì sai tất =). PolledWait dùng trong game không bị lỗi pause và chính xác hơn nhiều TriggerSleepAction, khẳng định luôn.
    BJ thì làm sao ? Nó chỉ có nhược điểm duy nhất là leak không null timer, mà trả lời cho bạn bên trên mới tập tành JASS nên mình không đưa PolledWait2 ra.

    GetTriggerUnit() luôn tốt hơn và MUI.
     
    Chỉnh sửa cuối: 19/3/14
  13. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    rất tiếc rằng. mình không có học về phần model nên mình không thể chỉ bạn cách sử dụng node của Model đó. còn về kéo dán model trong in game là có thể mà mình không thê tả hết dc :-ss
    mình để ý là 3 cái buff mình tả Impale,Tornado Spin,Cyclone bạn vào objectEditor tìm BUFF tìm 3 tên buff đó có thể thay đổi effect = cái effect bạn đề xuất xài thử :-?

    nếu thích xài func đó mà sợ BJ thì khử BJ :-j sợ leak thì viết lại 1 từ set t = null vào func khử BJ =))

    GetSpellAbilityUnit() là ý của event đó rồi còn GetTriggerUnit() tự tìm hướng đối tượng sự kiện được đề suất
     
  14. Ăn xong dong

    Ăn xong dong Mr & Ms Pac-Man

    Tham gia ngày:
    7/6/11
    Bài viết:
    136
    Cám ơn mọi người giúp đỡ :( Mình làm spell Bladestorm mình làm GUI thì event " a unit stars the effect of an ability" ko được nên chuyển qua channeling an ability. Lúc convert ra thì nó là SPELL_CHANNEL nên cứ thế mà tiến. Spell này lúc đầu mình convert ra làm jass chỉnh sữa vài cái thì ngon ơ nhưng tập tành làm vjass chỉnh sữa như các bác thấy thì ko được :(. Mình đã dùng PolledWait và đổi thành GetTriggerUnit() đã set c = null nhưng không được :(( Cám ơn
     
  15. HiroshiKaze

    HiroshiKaze Youtube Master Race

    Tham gia ngày:
    19/8/12
    Bài viết:
    66
    Nơi ở:
    Tp.HCM
    chú thay cái tên function InitTrig lại há
    Mã:
    scope NAME initializer init
        ...
        private function init takes nothing returns nothing
            ...
        endfunction
    endscope
    

    @magicz123: ta chả gây hấn gì chú cả, ta nghĩ thế nào thì nói ra thế đấy, gạch đá gì thì cứ quăng ta nhận và xem lại nên đừng có hỏi làm WE bao lâu gì, giờ ta bảo 1 ngày đấy chú tin không? Nếu k tin thì nói ra thời gian khác chú cũng k tin thế nên đừng hỏi câu gì mà mình không mún nghe câu trả lời. Cái GetTriggerUnit() thì ta vốn biết nó nhanh hơn cái kia rùi, còn vụ MUI thì cái kia cũng dc đấy thôi?
    Không tin thì test thử cái này xem:
    Mã:
    scope spell initializer init
        private function act takes nothing returns nothing
            local unit u
            if GetSpellAbilityId() == 'A000' then
                set u = GetSpellAbilityUnit()
                call SetUnitInvulnerable(u,true)
                call TriggerSleepAction(20.)
                call SetUnitInvulnerable(u,false)
                set u = null
            endif
        endfunction
        
        private function init takes nothing returns nothing
            local trigger t = CreateTrigger()
            call TriggerRegisterPlayerUnitEvent(t,Player(0),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
            call TriggerAddAction(t,function act)
            set t = null
        endfunction
    endscope
    
    @dh-g: >:)
     
  16. magicz123

    magicz123 Mr & Ms Pac-Man Lão Làng GVN

    Tham gia ngày:
    31/5/07
    Bài viết:
    185
    Ngắn gọn: GetTriggerUnit() MUI Wait và an toàn hơn, còn lại tự Google.
    Thử làm một spell dùng GetSpellAbilityUnit() rồi upload lên Hiveworkshop xem đến mấy năm nữa sẽ được Approve.
     
    Chỉnh sửa cuối: 20/3/14
  17. Ăn xong dong

    Ăn xong dong Mr & Ms Pac-Man

    Tham gia ngày:
    7/6/11
    Bài viết:
    136
    @HiroshiKaze: Mình đã thử lâu rùi :( kết quả là ko vào game được. Mình đoán chắc có vấn đề gì đó như không chạy được chứ code thì mình căng mắt ra nhìn cũng ko biết sai chổ nào T_T. Mình đã thử copy một vài spell vjass thay id spell khi test thì cũng không vào game được. Cám ơn ai giúp với :((
     
  18. HiroshiKaze

    HiroshiKaze Youtube Master Race

    Tham gia ngày:
    19/8/12
    Bài viết:
    66
    Nơi ở:
    Tp.HCM
    @Ăn xong dong: Mình đoán là bạn Enable thằng RtC, thử Distable nó xem: Trong JassNewgen -> Disable "Reinventing the Craft."
     
  19. magicz123

    magicz123 Mr & Ms Pac-Man Lão Làng GVN

    Tham gia ngày:
    31/5/07
    Bài viết:
    185
    Không vào đựoc map có phải khi ấn test map nó hiện ra phần Menu game ? Nếu là vậy kiểm tra xem trong map có xài Local Handle Vars của KaTTaNa không ? Ngoài ra kiểm tra xem có function H2I hay mấy cái tưong tự mà return những 2 lần kiểu này này:

    Thì xóa đi hoặc sửa nó lại thành return GetHandleId(h) để loại bỏ return bugs.
     
  20. Ăn xong dong

    Ăn xong dong Mr & Ms Pac-Man

    Tham gia ngày:
    7/6/11
    Bài viết:
    136
    Cám ơn bạn đã thử và không thành công :)) số mình nhọ quá rùi. Kiểm tra thấy "Reinventing the craft. Version 0.2" Phiên bản 0.2 này liệu có chạy được không nhỉ o.0! ??
     

Chia sẻ trang này