[Thảo luận]làm Spell bằng Jass - chia sẻ và học hỏi ^^!

Thảo luận trong 'World Editor' bắt đầu bởi sukaraki, 26/3/09.

  1. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    Mình thực sự không muốn rời GUI qua jass , vì đã quá quen với việc làm spell nói riêng và map nói chung bằng GUI. Nhưng vì dự án mới đây ,1 map build hero từ basic ra tới 32 hướng đi , thế nên có nhiều trường hợp các bạn build hero cùng hướng đi, giống skill nhau, mà GUI thì rất khó làm MUI - Multi Instancable gì gì đấy - tạm hiểu là spell mà nhiều con cùng cast được. Thế là đành phải bỏ GUI thôi :D . Bây giờ vì thời gian gấp rút , mà kiến thức thì nông cạn, nên mình lập topic này để anh em đang học Jass vào cùng nhau thảo luận và chia sẻ Code spell của mình.

    Mở hàng : các bạn check leak dùm mình spell mới làm này - mò mãi vẫn ko hiểu bị leak chỗ nào T_T

    Spell mega crushing wave hiệu ứng đại hồng thủy cực khủng , cực mượt , bao nhiêu con cast cũng đc :cool: , có điều sau khi cast vài chục phát là máy đơ luôn T_T

    test : 10 con phù thủy cùng cast 8 lần thì máy giựt. 10X8 = 80 lần cast.
     
  2. Dark_DragonKing

    Dark_DragonKing Mr & Ms Pac-Man

    Tham gia ngày:
    23/7/08
    Bài viết:
    217
    Bỏ BJ ở đằng sau đi cho nó lành

    FHL là cái gì?? hình như la FlushHandleLocal cua KaTTaNa
    đoạn trên cùng chuyển thành


    return GetSpellAbilityId() == 'sk07'

    local unit d
    set d = CreateUnitAtLoc....

    Hiệu ứng khủng nên lag là phải?đúng hem? :D

    cái đoạn function casmega takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit dum = GHUnit( t, "dummy")
    local unit cas = GHUnit( t, "caster")
    call SetUnitPositionLocFacingBJ( dum, GetRandomLocInRect(RectFromCenterSizeBJ(GetUnitLoc (cas), 250.00, 250.00)), GetUnitFacing(cas) )
    call IssuePointOrderLocBJ( dum, "carrionswarm", PolarProjectionBJ(GetUnitLoc(dum), 256, GetUnitFacing(cas)) )
    endfunction
    chưa null var: t dum cas
    cả DestroyTimerv.v..

    Nên sư dụng GetTriggerUnit hơn là GetSpellAbilityUnit()

    còn lại nghĩ sau vậy ....

    Dạo này đang học xài vJASS, có gì nhờ Tom chỉ giáo nhìu

    quên còn fai pausetimer nữa

    Để viết lại thử xem

    ==Rosario†Vampire==
     
  3. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    -cảm ơn bạn, đúng là mình chưa remove leak chỗ function casmega.
    -Còn vụ pause timer bạn nhầm rồi đó . timer cho chạy liên tục cast spell liên tục mà , sau 1.2 giây hủy timer rồi.
    -Còn gettriggerunit với getspellabilityunit thì cái thứ 2 nó ít tổng quát hơn chứ ? gettriggerunit tổng quát quá sợ catch nhầm event thì sao.
    -Sáng nay server bị gì đó, mình ko lên đây đc, tự sửa ở nhà, thì thành công rồi, tại lộn chỗ dưới, set = null trước remove sau, nên lúc sau nó đâu biết remove thằng nào .Đổi vị trí lại là xong.Tui test kiểu bệnh hoạn là : mới vô cho chạy loop từ 1 tới 50, tạo 50 con lính, add skill cho nó, sau đó đưa chúng nó vào group. Rồi mỗi lần chat "cas" , thì pick 50 con đó bắt cast phép. Lúc cast thì giựt tung màn hình, nhưng khi cast xong lập tức mướt rượt. Chả hiểu còn leak phía trên chỗ megacas, chưa remove, mà 50 con cast nhiều lần map vẫn ko sao ????


    ____________________________

    Chủ đề này ít mem quan tâm nhỉ >"<
     
  4. rongdoVN

    rongdoVN Space Marine Doomguy Lão Làng GVN

    Tham gia ngày:
    6/9/05
    Bài viết:
    5,663
    Nơi ở:
    TS-Pri GameVN
    nhìn jass cũng hay nhưng mà ko hiểu mấy cái handle cho lắm ::(
    chắc cần pro giảng thêm mấy cái handle :D
     
  5. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    Còn đây là spell Hell Slam đẹp lòi mắt : blade master nhảy lên và dập xuống đất nổ lửa , có animation Jump đàng hoàng.

    ko hiểu sao đập thì ngon, MUI cũng ngon, test 20 con cast cùng lúc ko sao, nhưng dính chỗ nó ko gây damage >"<
    mấy bro sửa giúp với ! heo mi !

     
  6. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    Ko gây dmg là đúng mà, điều kiện pick có đúng đâu, trong function Trig_hell_slam_Func02 thì làm gì có "GetExpiredTimer()", sở dĩ function Trig_hell_slam_jump có "GetExpiredTimer()" là vì func này là "callback" function của timer
    Muốn "giải quyết" vụ này, tạo 1 global var, lưu "caster" vào rồi gọi func ForGroupBJ, ở func Trig_hell_slam_Func02 thì tất nhiên phải dùng var kia mà xét điều kiện rồi.
    --------
    dùng code tag thì cho code vào: [.code]<đặt code vào đây>[/.code] (nhớ bỏ dấu chấm "." )
     
  7. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    thanks anh.
    em đã cho trước khi pick unit
    rồi trong hàm gọi thì
    test ok, nhưng em vẫn nghi ngờ tính MUI của nó ... nhỡ chúng nó cast cùng lúc mà thằng gây dam chỉ là 1 thằng nào đó thì ...
     
  8. rongdoVN

    rongdoVN Space Marine Doomguy Lão Làng GVN

    Tham gia ngày:
    6/9/05
    Bài viết:
    5,663
    Nơi ở:
    TS-Pri GameVN
    có ai biết mấy cái handle dùng để làm gì ko ???
    rồi trong jass có nhiều cái mà trong jass code ko có
    vd như

    Mã:
    local timer t = GetExpiredTimer()
    local unit cas = GHUnit( t, "AOshcas")
    local location loc = GHLoc( t , "AOshloc" )
    local location casloc = GHLoc( t , "AOshcasloc" )
    local real dis = GHReal( t , "AOshdis" 
     
  9. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    @RongdoVN :
    khi bạn chuyển qua jass, nghĩa là bạn muốn làm spell mượt mà, gọn gàng , và quan trọng là MUI , vì thế mới có cái handlevar của Kattana , trước tiên bạn phải import cái system đó vào map, sau đó dùng thì dễ thôi : muốn lưu thì dùng SHHandle , SHReal , SHint .... muốn lấy ra thì dùng GHUnit ,GHReal ,GHint , GHLoc ...
    cách dùng chi tiết :
    http://forum.gamevn.com/showpost.php?p=9831894&postcount=9
     
  10. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
  11. rongdoVN

    rongdoVN Space Marine Doomguy Lão Làng GVN

    Tham gia ngày:
    6/9/05
    Bài viết:
    5,663
    Nơi ở:
    TS-Pri GameVN
    vậy có nghĩa là handle = system giống ở GUI vậy à
    vậy sukari cho xin đoạn jass knockback mà hok phãi là system giùm nha
    hoặc spell jass knockback tương tự cũng đc :D
     
  12. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    knockback hả ? xin ông Tom đi , ổng lúc nào làm example cũng làm spell đó, kiếm bài Tut nào của ổng cũng thấy :D
     
  13. DarkKing2828

    DarkKing2828 Youtube Master Race

    Tham gia ngày:
    20/3/09
    Bài viết:
    69
    Cho em hỏi làm Jass như vậy thì có gì sai mà nó lại ko có làm theo các special effect trong function ::(::(
     
  14. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    mọi người LÀM ƠN cho jass vào CODE tag với, biểu tượng này này: [​IMG]
    nếu dùng "trả lời nhanh", ko có biểu tượng đó thì: [code.] <jass> [/code.] <- bỏ dấu chấm đi

    --------
    @DarkKing2828, path của effect sao lại có dấu "cách" thế ? "Phoenix_Missi le.mdl", "FlameStrik e1.mdl"
     
  15. DarkKing2828

    DarkKing2828 Youtube Master Race

    Tham gia ngày:
    20/3/09
    Bài viết:
    69
    nhưng spell em ko có special effect đã đành nhưng mà nó lại ko có fly height là 800 nữa chứ ::(::(
     
  16. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    em đã "set" Caster và Target chưa ? mà đã "dùng" ?

    Mã:
    function Trig_ShockWave_Actions takes nothing returns nothing
        local location Target
        local unit Caster
        call SetUnitAnimation( Caster, "slam" ) //<- Caster là ai ?
        call SetUnitTimeScalePercent( Caster , 0.00 ) //<- Caster là ai ?
        call SetUnitFlyHeightBJ( Caster , 800 , 800 )  //<- Caster là ai ?
        call AddSpecialEffectTargetUnitBJ( "weapon" , Caster , "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missi le.mdl" )   //<- Caster là ai ?
        call DestroyEffectBJ( GetLastCreatedEffectBJ() )
        call TriggerSleepAction ( 1.5 )
        call SetUnitFlyHeightBJ( Caster, 0 , 0 )  //<- Caster là ai ?
        call SetUnitTimeScalePercent ( Caster , 100.00 )  //<- Caster là ai ?
        set Target = GetSpellTargetLoc() //<- set đây hả ?
        set Caster = GetSpellAbilityUnit() //<- set đây hả ?
        call AddSpecialEffectLocBJ( Target , "Abilities\\Spells\\Human\\FlameStrike\\FlameStrik e1.mdl" )
        set Caster = null
    endfunction 
    
    hơn nữa, trc khi đổi fly height PHẢI add/remove ability "Crow Form" nếu MOvement Type chưa phải là Fly
    Mã:
    call UnitAddAbility( <unit>, 'Amrf')
    call UnitRemoveAbility( <unit>, 'Amrf')
    call SetUnitFlyHeight( <unit>, <height> , <rate>)
    
     
  17. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    @DarkKing2828 kinh khủng thật, làm Jass phải có ít kiến thức cơ bản về lập trình.Này ngay cả gán trị trước rồi mới đc dùng cũng ko biết , thì nhào vô Jass như con thiêu thân nhỉ ? ban đầu bạn làm nhuần nhuyễn trigger đi , rồi convert sang custom text, rồi đọc hiểu rồi hẵng viết Jass.
     
  18. Dark_DragonKing

    Dark_DragonKing Mr & Ms Pac-Man

    Tham gia ngày:
    23/7/08
    Bài viết:
    217
    >>>>Từ bài viết của sukaraki trong box vo lam truyen ki<<<<
    #799 29-03-2009, 08:17
    sukaraki
    GameVN Member
    4th Class Gamer Ngày tham gia: 12-05-2008
    Đến từ: Demonworld
    Bài viết: 280
    Rep Power: 4


    bạn ko xài jass vẫn anti-leak đc như thường, tại lười thôi , thêm 1 vài dòng custom script là xong mà : call RemoveLocation( udg_vịtrí ) , call DestroyGroup( udg_group ) ... v...v.. unit thì có cái remove unit trong GUI rồi, string, int , real thì ko cần destroy , special effect trong GUI cũng có lệnh destroy rồi.

    Chưa hẳn là vậy đâu??? Vì sao ???
    ====>Các BJ func của blizzard hầu hết đều có leak >.<, anti leak cái này mới là khó đó

    Ví dụ trong các func của blizzard có CreateGroup, đã DestroyGroup nhưng lịa ko set = null zzzz

    PolledWait(wait game-time) cũng vậy, leak timer do ko set null
    GroupAddGroup, GetUnitsTypeIdAll, cái matching gì đó mà hay xài cũng vậy.
    Vì vậy ngươi ta mới nói làm jass map mới mượt, bởi xóa đi được khá nhiều leak. :D
     
  19. SsNaix

    SsNaix Youtube Master Race

    Tham gia ngày:
    13/4/09
    Bài viết:
    3
    :) Hi
    Mình có làm 1 skill Jump cho thằng Blake hoạt động tốt nhưng có chổ mình thấy rất khó hiểu là nhiều hero cast cùng lúc skill đó thì bị lỗi :-o . Vậy phải làm sao ? :|
    Xin mọi người chỉ dzùm :((
    Skill nó thế này ;)) ( đừng cười nhá) . Skill có 2 phần là Jump và Move
    Jump :
    function Trig_Jump_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A03J' ) ) then
    return false
    endif
    return true
    endfunction

    function Trig_Jump_Func023001 takes nothing returns boolean
    return ( GetUnitAbilityLevelSwapped('A03J', udg_JumpCast) == 1 )
    endfunction

    function Trig_Jump_Func024001 takes nothing returns boolean
    return ( GetUnitAbilityLevelSwapped('A03J', udg_JumpCast) == 2 )
    endfunction

    function Trig_Jump_Func025001 takes nothing returns boolean
    return ( GetUnitAbilityLevelSwapped('A03J', udg_JumpCast) == 3 )
    endfunction

    function Trig_Jump_Actions takes nothing returns nothing
    set udg_JumpCast = GetSpellAbilityUnit()
    set udg_JumpPoint = GetUnitLoc(udg_JumpCast)
    set udg_JumpVictim = GetSpellTargetLoc()
    call AddSpecialEffectTargetUnitBJ( "weapon,right", udg_JumpCast, "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile_mini.mdl" )
    call PauseUnitBJ( true, udg_JumpCast )
    call SetUnitInvulnerable( udg_JumpCast, true )
    call SetUnitFacingToFaceLocTimed( udg_JumpCast, udg_JumpVictim, 0.00 )
    call SetUnitAnimation( udg_JumpCast, "slam" )
    call SetUnitTimeScalePercent( udg_JumpCast, 50.00 )
    call UnitAddAbilityBJ( 'Amrf', udg_JumpCast )
    call SetUnitFlyHeightBJ( udg_JumpCast, 500.00, 500.00 )
    call EnableTrigger( gg_trg_Move )
    call TriggerSleepAction( 0.70 )
    call SetUnitFlyHeightBJ( udg_JumpCast, 0.00, 500.00 )
    call TriggerSleepAction( 0.70 )
    call DisableTrigger( gg_trg_Move )
    call SetUnitTimeScalePercent( udg_JumpCast, 100.00 )
    call UnitRemoveAbilityBJ( 'Amrf', udg_JumpCast )
    call SetUnitInvulnerable( udg_JumpCast, false )
    call PauseUnitBJ( false, udg_JumpCast )
    if ( Trig_Jump_Func023001() ) then
    call CreateNUnitsAtLoc( 1, 'e006', GetOwningPlayer(udg_JumpCast), udg_JumpVictim, bj_UNIT_FACING )
    else
    call DoNothing( )
    endif
    if ( Trig_Jump_Func024001() ) then
    call CreateNUnitsAtLoc( 1, 'e007', GetOwningPlayer(udg_JumpCast), udg_JumpVictim, bj_UNIT_FACING )
    else
    call DoNothing( )
    endif
    if ( Trig_Jump_Func025001() ) then
    call CreateNUnitsAtLoc( 1, 'e008', GetOwningPlayer(udg_JumpCast), udg_JumpVictim, bj_UNIT_FACING )
    else
    call DoNothing( )
    endif
    call IssueImmediateOrderBJ( GetLastCreatedUnit(), "stomp" )
    call RemoveUnit( GetLastCreatedUnit() )
    call DestroyEffectBJ( GetLastCreatedEffectBJ() )
    call AddSpecialEffectLocBJ( udg_JumpVictim, "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl" )
    call AddSpecialEffectLocBJ( udg_JumpVictim, "Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl" )
    endfunction

    //===========================================================================
    function InitTrig_Jump takes nothing returns nothing
    set gg_trg_Jump = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Jump, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Jump, Condition( function Trig_Jump_Conditions ) )
    call TriggerAddAction( gg_trg_Jump, function Trig_Jump_Actions )
    endfunction
    :D
    Move :
    function Trig_Move_Actions takes nothing returns nothing
    set udg_JumpPoint = GetUnitLoc(udg_JumpCast)
    set udg_MovePoint = PolarProjectionBJ(udg_JumpPoint, ( DistanceBetweenPoints(udg_JumpPoint, udg_JumpVictim) / 100.00 ), GetUnitFacing(udg_JumpCast))
    call SetUnitPositionLoc( udg_JumpCast, udg_MovePoint )
    endfunction

    //===========================================================================
    function InitTrig_Move takes nothing returns nothing
    set gg_trg_Move = CreateTrigger( )
    call DisableTrigger( gg_trg_Move )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Move, 0.01 )
    call TriggerAddAction( gg_trg_Move, function Trig_Move_Actions )
    endfunction
    ;;)
    Chỉ thế thôi mà khi chơi lúc nhiều hero cùng cast skill là bị lỗi . Mình cũng đã xem nhiều Topic liên quan đến vấn đề này nhưng cũng đành "bó chíu" :-o . Mọi người giúp dzùm ( thật tình rất cần sự giúp đở):( thanks .
     
  20. rongdoVN

    rongdoVN Space Marine Doomguy Lão Làng GVN

    Tham gia ngày:
    6/9/05
    Bài viết:
    5,663
    Nơi ở:
    TS-Pri GameVN
    cái spell đấy thà làm = GUI còn hơn vì vốn dĩ nó từ GUI convert ra jass mà =))
    còn việc chơi nhiều hero cast bị lỗi là do spell này ko MUI đi học làm spell MUI đi :)
     

Chia sẻ trang này