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

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 GetBooleanAnd( Trig_Holy_Light_Func004002003002001(), Trig_Holy_Light_Func004002003002002() )
endfunction

function Trig_Holy_Light_Func004002003 takes nothing returns boolean
    return GetBooleanAnd( Trig_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 SetUnitLifeBJ( t, ( GetUnitState(t, UNIT_STATE_LIFE) + r ) )
    set ug = GetUnitsInRangeOfLocMatching(200.00, tp, Condition(function Trig_Holy_Light_Func004002003))
    
    loop                              
        set pu = FirstOfGroup(ug)
        exitwhen pu == null
        call GroupRemoveUnit(ug, pu)     
        call UnitDamageTarget( c, pu, r, false, true, ATTACK_TYPE_HERO, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_AXE_MEDIUM_CHOP )
        set e = AddSpecialEffectTargetUnitBJ("origin", pu, "Abilities\\Spells\\Items\\StaffOfPurification\\PurificationCaster.mdl" )
        call DestroyEffect( e )
    endloop
    
    set c = null
    set p = null
    set t = null
    call DestroyGroup ( ug )
    call RemoveLocation( tp )
    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 TriggerRegisterAnyUnitEventBJ( gg_trg_Holy_Light, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Holy_Light, Condition( function Trig_Holy_Light_Conditions ) )
    call TriggerAddAction( gg_trg_Holy_Light, function Trig_Holy_Light_Actions )
endfunction
 
quên mất, hôm trước hỏi câu này, bác hiro trả lời chưa đúng mà quên mất mình có bằng chứng, cứ tưởng w3 không làm được,
giờ cho em hỏi lại làm sao để Unit nó lùn đi như này với ạ
http://chaosrealm.info/topic/8316882/1/#new
(lệnh call SetUnitScale(unit, scaleX, scaleY, scaleZ) không đúng, lệnh trung GUI cũng không nhé )

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

Thua -.- nhớ đấy bắt bẻ kinh thiệt -.-"


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

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 GetBooleanAnd( Trig_Holy_Light_Func004002003002001(), Trig_Holy_Light_Func004002003002002() )
endfunction

function Trig_Holy_Light_Func004002003 takes nothing returns boolean
    return GetBooleanAnd( Trig_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 SetUnitLifeBJ( t, ( GetUnitState(t, UNIT_STATE_LIFE) + r ) )
    set ug = GetUnitsInRangeOfLocMatching(200.00, tp, Condition(function Trig_Holy_Light_Func004002003))
    
    loop                              
        set pu = FirstOfGroup(ug)
        exitwhen pu == null
        call GroupRemoveUnit(ug, pu)     
        call UnitDamageTarget( c, pu, r, false, true, ATTACK_TYPE_HERO, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_AXE_MEDIUM_CHOP )
        set e = AddSpecialEffectTargetUnitBJ("origin", pu, "Abilities\\Spells\\Items\\StaffOfPurification\\PurificationCaster.mdl" )
        call DestroyEffect( e )
    endloop
    
    set c = null
    set p = null
    set t = null
    call DestroyGroup ( ug )
    call RemoveLocation( tp )
    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 TriggerRegisterAnyUnitEventBJ( gg_trg_Holy_Light, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Holy_Light, Condition( function Trig_Holy_Light_Conditions ) )
    call TriggerAddAction( gg_trg_Holy_Light, function Trig_Holy_Light_Actions )
endfunction

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

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
 
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 SetUnitInvulnerable( c, true )
    call TriggerSleepAction( 7.00 )    
    call SetUnitInvulnerable( c, false )
endfunction

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

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

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ỉ????
 
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á ~.~
 
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:
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á

Về GetSpellAbilityUnit() thì không vấn đề gì cả, sao lại phải đổi GetTriggerUnit() nhỉ????

Đồ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:
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

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ử :-?

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

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

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

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: >:)
 
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:
@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 :((
 
@Ăn xong dong: Mình đoán là bạn Enable thằng RtC, thử Distable nó xem: Trong JassNewgen -> Disable "Reinventing the Craft."
 
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:

Function H2I takes returns
return h
return null
endfunction

Thì xóa đi hoặc sửa nó lại thành return GetHandleId(h) để loại bỏ return bugs.
 
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! ??
 
Back
Top