Topic post, bàn luận, đóng góp ý kiến, thắc mắc, giải đáp, bình phẩm về Custom Spell.

Thảo luận trong 'World Editor' bắt đầu bởi raivor, 7/1/11.

  1. ShadowThanatos

    ShadowThanatos -|--Soul Reaper--|-

    Tham gia ngày:
    23/2/09
    Bài viết:
    2,119
    Nơi ở:
    Horror Depht
    Chính vì nói chung chung spell mới không bị trùng ý tưởng =)).

    Anyway, cứ tiếp tục hâm nóng cái topic này, 1 way or another. Event cho box thì unlikely to happen.

    Còn các bạn newbie, muốn học spell thì cứ post vào đây, không biết gì thì hỏi nhưng tuyệt đối phải "vắt" não trước khi hỏi.

    Ku WE lo mà giải thích cái spell Holy Light đi.
     
    Chỉnh sửa cuối: 24/2/11
  2. LeoNguyen112

    LeoNguyen112 Thành viên cấp 5

    Tham gia ngày:
    22/5/10
    Bài viết:
    1,438
    Nơi ở:
    TP.HCM
    Không ai chữi bạn đâu, tham gia cho lên tay nhé.

    @All: Vậy chúng ta bắt đầu làm spell lại từ đây nhé, mình đề nghị là nên bắt đầu với "đề thi" của shadow, và mình hẹn vài hôm nữa sẽ tham gia :)
     
  3. raivor

    raivor Thành viên cấp 5

    Tham gia ngày:
    24/7/09
    Bài viết:
    1,337
    Không không, không trùng nhưng sẽ cạn bác ạ. Nhưng nếu vậy thì thống nhất vậy nhé, bác sẽ ra đề theo kiểu của bác, em ra đề theo kiểu của em, 1 tuần phải mỗi người ra 1 đề. Như vậy là vừa có thêm đề vừa tốt cho mọi người. Update thông tin về những bạn có quyền ra đề. Và chính thức bắt đầu tuyển giám khảo để chấm spell, cũng như bài thi. Sẽ tuyển trong 1 tháng, mong các bạn làm nhiều spell để có tạo điều kiện tuyển giám khảo.
     
  4. WordEditor

    WordEditor Thành viên cấp 5

    Tham gia ngày:
    8/9/08
    Bài viết:
    1,509
    Nơi ở:
    Leaf Village
    Hiện giờ máy nhà mình đang bị hư, không đc phép sửa cho đến tháng 7, chỉ có thể update và post bài khi ra ngoài net (như khi nãy). Còn ngoài ra thì mình post bài và theo dõi forum qua đtdđ, nên mình hứa sẽ update phần hướng dẫn cho các bạn khi ra ngoài lần sau.
    Ps: riêng cậu ST, tôi không biết cậu bao nhiêu tuổi hay hơn tôi bao nhiêu tuổi, tôi không có ác ý gì nhưng tôi không thích cách cậu gọi tôi như thế, đừng để mem khác nhìn vào mà thấy mình bất lịch sự và thiếu tôn trọng người khác.
     
    Chỉnh sửa cuối: 24/2/11
  5. [Yami]

    [Yami] Thành viên cấp 5

    Tham gia ngày:
    29/12/07
    Bài viết:
    313
    Nơi ở:
    Ha Noi, Vietnam,
    Mình chưa có ý tưởng gì cho 2 đề của ST với raivor, vì vậy nên post tạm spell khác lên nhé :P

    Spell Soul Catching
    I) Giới thiệu:
    Skill giống ultimate của Puppet Master trong HoN. Cast vào 1 em (Target) sau đó tạo 1 cái Soul (trong HoN là cái cọc ế) cạnh Caster, mỗi lần cái Soul đó ăn damage là Target cũng dính damage.
    Nói chung là skill khá đơn giản và dễ làm, làm tí chơi chơi cho vui :P
    II) Yêu cầu:
    Các script Intuitive Damage Detection SystemTableJNGP (Đã có trong Demo :) )
    III) Demo:
    Download Here
    IV) Script:
    Nói chung là script mình viết kiểu lười, chịu khó đọc tí, ngắn mà :P

    Mã:
    scope SoulCatcher initializer Init
        /* Configurable */
            globals
                private constant integer AbiID = 'A000' //Raw ID cua skill
                private constant integer Soul = 'o000' //Raw ID cua soul
                private Table UnitLink            
            endglobals    
            
            //Damage ma target nha^n. duoc. la` (Damage Soul nha^.n) * Factor
            private function Factor takes integer level returns real
                return 1.0 + 0.4 * level //return la` ham` tra? ve` 1 gia tri., o? day gia tri la real.
            endfunction
        /* End Configurable */
        
        /* Core Script */
            //Tao Table, dung de luu data cua Caster, Target, Soul
            private function onInit takes nothing returns nothing
                set UnitLink = Table.create() //Tao Table moi
                call UnitLink.reset()
            endfunction
            
        private struct data
            unit c //Caster
            unit s //Soul
            unit t //Target
            
            static method Cond takes nothing returns boolean
                return GetSpellAbilityId() == AbiID //Check spell cast co phai Ability minh tao. khong
            endmethod
            
            static method Check takes nothing returns boolean
                return GetUnitTypeId(GetTriggerDamageTarget()) == Soul or GetUnitTypeId(GetTriggerUnit()) == Soul //Check con bi. dap. hoac bi chet co phai la loai. Soul khong.
            endmethod
            
            static method Act takes nothing returns nothing
                local thistype this = thistype.create()
                set .c = GetSpellAbilityUnit() //ghi Caster  vao bien'
                set .t = GetSpellTargetUnit()           //ghi Target vao bien'
                set .s = CreateUnitAtLoc(GetOwningPlayer(.t),Soul,  GetUnitLoc(.c), 0 ) //Tao 1 con Soul canh. Caster
                call DestroyEffect(AddSpecialEffectLocBJ( GetUnitLoc(.s), "Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl" )) //Tao effect cho con Soul moi tao ra
                call UnitApplyTimedLifeBJ( 15, 'BTLF', .s ) //Tao thoi gian song cho Soul la 15 giay, co the thay doi
                set UnitLink[GetHandleId(.s)] = this
            endmethod
            
            static method Flush takes nothing returns nothing         
                local thistype this = UnitLink[GetHandleId(GetTriggerUnit())]            
                call UnitLink.flush(GetHandleId(.s))   //Flush table, tranh leak :P         
                call .destroy()
            endmethod
            
            static method Link takes nothing returns nothing
                local thistype this = UnitLink[GetHandleId(GetTriggerUnit())]
                call UnitDamageTargetEx(.c,.t,GetTriggerDamage()*Factor(GetUnitAbilityLevel(.c,AbiID)),ATTACK_TYPE_HERO,DAMAGE_TYPE_EXTRA,false) //Damage target, co the thay doi cai nay neu :))
                call DestroyEffect(AddSpecialEffectTargetUnitBJ( "head", .t, "Abilities\\Spells\\Undead\\DeathandDecay\\DeathandDecayDamage.mdl" )) //Effect khi Soul nhan damage tre^n nguoi con Target
            endmethod
        endstruct
            
            private function Init takes nothing returns nothing
                local trigger a
                
                /* Casting Trigger */
                set a = CreateTrigger()
                call TriggerRegisterAnyUnitEventBJ( a, EVENT_PLAYER_UNIT_SPELL_EFFECT )
                call TriggerAddAction(a, function data.Act)
                call TriggerAddCondition(a, Condition(function data.Cond))
                
                /* Damaged Trigger */
                set a = CreateTrigger()
                call TriggerRegisterDamageEvent(a,0)
                call TriggerAddAction(a, function data.Link)
                call TriggerAddCondition(a, Condition(function data.Check))
                
                /* Flush Soul */
                set a = CreateTrigger()
                call TriggerRegisterAnyUnitEventBJ( a, EVENT_PLAYER_UNIT_DEATH )
                call TriggerAddAction(a, function data.Flush)
                call TriggerAddCondition(a, Condition(function data.Check))
                
                /* Init */
                call onInit()
            endfunction
        /* End Core Script */
    endscope
    
    Hình ảnh:
    [spoil][​IMG][/spoil]
     
    Chỉnh sửa cuối: 25/2/11
  6. raivor

    raivor Thành viên cấp 5

    Tham gia ngày:
    24/7/09
    Bài viết:
    1,337
    Bạn nên viết giải thích rõ hơn, vì đây là jass nên theo mình bạn nên giải thích từng đoạn code luôn, vd nó dùng để làm gì, tại sao lại đặt ở đó. Còn nữa là mình chắc dù có đọc vài chục lần mà giải thích vậy thì không hiểu được cái gì hết.
    Cuối cùng là bài của bạn thiếu ảnh minh họa. Bổ sung nhé. Cám ơn!
     
  7. [Yami]

    [Yami] Thành viên cấp 5

    Tham gia ngày:
    29/12/07
    Bài viết:
    313
    Nơi ở:
    Ha Noi, Vietnam,
    Đã bổ sung hình ảnh và thêm 1 ít giải thích. Nói thật mình không giỏi vụ giải thích :(
     
  8. AzuhaSky

    AzuhaSky Thành viên cấp 5

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Spell: Super Frost Bolt
    Một chiêu thức mình tự nghĩ ra,cái này có lẽ dành cho các bạn không rành nhiều về các xebasic system!Newbie có thể tải về học hỏi.
    Sau đây sky cho các bạn xem:
    Mô tả
    Lập tức từ mọi phía phóng ra 10 Frost Bolt.Trong phạm vi 500m,Frost Bolt sẽ đuổi theo kẻ thù xung quanh và gây sát thương chúng!
    Chiêu thức hệ băng của Undead đấy!
    [​IMG]
    Và linkdown để xem:FrostBoltSpell
    Chia sẽ!:)
    P/s WorldEditor: Cảm ơn!
     
    Chỉnh sửa cuối: 25/2/11
  9. WordEditor

    WordEditor Thành viên cấp 5

    Tham gia ngày:
    8/9/08
    Bài viết:
    1,509
    Nơi ở:
    Leaf Village
    Bạn nên bổ sung thêm phần mô tả spell, chỉ nhìn vào hình ảnh thì không thể biết đc nguyên lý hoạt động của nó như thế nào.
     
  10. ShadowThanatos

    ShadowThanatos -|--Soul Reaper--|-

    Tham gia ngày:
    23/2/09
    Bài viết:
    2,119
    Nơi ở:
    Horror Depht
    WE, thật ra tôi không biết cậu bao nhiêu tuổi, nhưng tôi nhớ không nhầm khi đó cậu rất thích nói "đùa" với người khác và giờ tôi nói "đùa" lại thì cậu "blah blah". Hardened rồi à?

    Nếu mem khác thấy tôi thiếu tôn trọng cậu thì xin lỗi nhưng tôi không nghĩ ai cũng serious về vụ này.

    BTW, muốn nói gì thêm vui lòng vào profile, tránh loãng topic
     
    Chỉnh sửa cuối: 25/2/11
  11. WordEditor

    WordEditor Thành viên cấp 5

    Tham gia ngày:
    8/9/08
    Bài viết:
    1,509
    Nơi ở:
    Leaf Village
    Update phần hướng dẫn Holy Light cho các bạn newbie và những ai cần hướng dẫn
    [spoil]Bây giờ mình sẽ giải thích về các trigger trong spell Holy ( chỉ giải thích kĩ những phần khó thôi nhé, còn phần quá đơn giản thì chỉ lướt qua thôi )

    Spell thuộc loại MUI,GUI

    Đầu tiên là các bạn phải tạo spell, dummy và hero

    Các spell cần tạo:

    -Holly Light: Spell này chỉ là 1 spell giả, thuộc loại "no target" để thực hiện trigger không quan trọng gì, nhớ add vào effect khi cast spell.

    -Light Target: Spell này là spell dành cho dummy, base từ Storm Bolt, khi đường sáng của hero gặp unit địch sẽ cho dummy cast spell này tạo ra các tia sáng khác ( tất nhiên spell này cũng phải MUI ).

    -Light: Spell này base từ spell Slow, gây buff lên địch dùng để check các unit đã dính spell để mà tránh trường hợp unit dính spell nhiều lần ( không nhất thiết phải lấy spell slow để tạo buff, spell nào cũng được )

    Các dummy cần tạo:

    -Dummy Light (Effect): model orb of slow, khi xếp nhiều unit này thành 1 đường thẳng thì sẽ tạo ra 1 đường ánh sáng, nhớ để hp 1 và regen hp -1 để cho unit die thì đường sáng kết thúc.

    -Dummy Light (AOE): Dummy này sử dụng để tạo tia sáng đầu tiên từ hero ra, gây damage AOE, về sau dùng để cast Light Target tạo tia sáng khác vào hero, theo hướng nhìn người chơi nghĩa là spell sẽ lan tỏa. Add cho Dummy này Light và cả Light Target.

    -Dummy Light (Target): Dummy này sẽ sử dụng spell Light vào unit địch, tạo cho unit địch buff "Holy Light", dùng để check các unit đã bị skill mà không skill tiếp nữa, nếu không sẽ rất "imba". Add cho dummy này spell Light.

    Mã:
    Holy Light 
    
        Events 
    
            Unit - A unit Starts the effect of an ability[I][U]//khi 1 unit cast spell[/U][/I] 
    
        Conditions 
    
            (Ability being cast) Equal to Holy Light[I][U]//spell là Holy Light[/U][/I] 
    
        Actions 
    
            Set MUI[1] = (MUI[1] + 1)[I][U]//cái này dùng để MUI ở hàm Loop như raivor đã nói ở trên[/U][/I] 
    
            Set Caster[MUI[1]] = (Casting unit)[U]//đặt biến Caster[/U] 
    
            Set CastPoint = (Position of Caster[MUI[1]])[I]//đặt vị trí của caster, phần này dư sau khi chỉnh sửa không cần thiết, mình quên xóa @@![/I] 
    
            Set Integer[MUI[1]] = (200 + ((Level of Holy Light  for Caster[MUI[1]]) x 25))[COLOR="royalblue"][U][I]//Đặt thời gian tia sáng di chuyển, lúc đầu theo dự định mình chỉ lặp mỗi 0.04s nên cứ 0.04 x 25 = 1s, phần 200 lúc đầu là khoảng thời gian cho animation của effect xuất hiện[/I][/U][/COLOR] 
    
            Countdown Timer - Start TimerHoly as a Repeating timer that will expire in 0.01 seconds[I][U]//Đặt timer lặp mỗi 0.01s[/U], lúc đầu thì mình định là 0.04s nhưng do tia sáng phát ra quá chậm hoặc không liền nhau đành sửa lại[/I] 
    
            Custom script:   call RemoveLocation(udg_CastPoint)[I]//phần này cũng dư[/I]
    Mã:
    Holy Light Move 
    
        Events 
    
            Time - TimerHoly expires[I][U]//Mỗi 0.04s[/U][/I]...
    
        Conditions 
    
        Actions 
    
            For each (Integer A) from 1 to MUI[1], do (Actions)[U][I]//Hàm Loop sẽ lặp từ 1 đến chỉ số "MUI". Trong hàm này, các biến mà các bạn dùng ở trên thì phần trong ngoặc vuông "[]" sẽ thay bằng "IntegerA", nghĩa là hàm sẽ lặp tất cả các biến từ [1],[2],...,[MUI], điều này sẽ giúp cho spell chúng ta có thể MUI được[/I][/U] 
    
                Loop - Actions 
    
                    If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                        If - Conditions 
    
                            Integer[(Integer A)] Greater than ((200 + ((Level of Holy Light  for Caster[(Integer A)]) x 25)) - 174)[U][I]//Đây là phần time cho animation của effect, sẽ trừ đi 174 chính là số thời gian cần để effect "vung kiếm"[/I][/U] 
    
                        Then - Actions 
    
                            Set Integer[(Integer A)] = (Integer[(Integer A)] - 1)[U][I]//Nếu chỉ số vẫn chưa hết 174, tiếp tục trừ đi[/I][/U] 
    
                        Else - Actions 
    
                            If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                                If - Conditions 
    
                                    Integer[(Integer A)] Greater than ((200 + ((Level of Holy Light  for Caster[(Integer A)]) x 25)) - 175)[U][I]//Ở đây là 175, nghĩa là 175-174=1, khoảng thời gian này là 0.01s cho chúng ta set vị trí của caster để tạo dummy và xác định hướng nhìn của caster[/I][/U] 
    
                                Then - Actions 
    
                                    Set Angle[(Integer A)] = (Facing of Caster[(Integer A)])[U][I]//Đặt biến cho hướng nhìn của Caster[/I][/U] 
    
                                    Set Integer[(Integer A)] = (Integer[(Integer A)] - 1) 
    
                                    Set CastPoint = (Position of Caster[(Integer A)]) 
    
                                    Unit - Create 1 Dummy Light (AOE) for (Owner of Caster[(Integer A)]) at CastPoint facing Default building facing degrees[I][U]//Tạo dummy và move dummy này từng 0.01s tiến về phía trước, mỗi lần move như thế sẽ tạo effect ở địa điểm của dummy, giúp tạo thành 1 effect mới theo đường thẳng[/U][/I] 
    
                                    Set DummyLightAOE[(Integer A)] = (Last created unit)[U][I]//Đặt biến là dummy vừa created[/I][/U] 
    
                                    Special Effect - Create a special effect at CastPoint using Abilities\Spells\Human\HolyBolt\HolyBoltSpecialArt.mdl[U][I]//Phần này là tạo effect khi tia sáng được bắn ra[/I][/U] 
    
                                    Special Effect - Destroy (Last created special effect) 
    
                                    Custom script:   call RemoveLocation(udg_CastPoint)[U][I]//Mỗi lần bạn tạo các biến Point, Group nhớ remove nó[/I][/U] 
    
                                Else - Actions 
    
                                    If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                                        If - Conditions 
    
                                            Integer[(Integer A)] Greater than 1[U][I]//Nếu Integer lớn hơn 1, ví dụ như 5, 25, 35, 100,... chẳng hạn thì hàm bên dưới vẫn cứ tiếp tục hoạt động cho đến khi nó bằng 1[/I][/U] 
    
                                        Then - Actions 
    
                                            Set PointDLA[(Integer A)] = (Position of DummyLightAOE[(Integer A)])[U][I]//Xác định địa điểm của dumy, điều này quan trọng vì mỗi lần move dummy sẽ thay đổi địa điểm liên tục[/I][/U] 
    
                                            Set PointDLAMove[(Integer A)] = (PointDLA[(Integer A)] offset by 15.00 towards Angle[(Integer A)] degrees)[U]//Đặt PointDLAMove là điểm cách [U]điểm của dummy vừa set trên tức "PointDLA"[/U] một khoảng = 15 range[/U] (hơi ngắn nhưng cứ 0.01s mà đi được như thế thì thử nhân lên xem nào) [U]theo [U]số degrees(độ) góc nhìn của caster tức biến "Angle"[/U][/U] 
    
                                            Unit - Move DummyLightAOE[(Integer A)] instantly to PointDLAMove[(Integer A)][U][I]//Di chuyển dummy đến khoảng vừa set trên, vậy là dummy của chúng ta đã nhích được lên 15 range trong 0.01s rồi đó[/I][/U] 
    
                                            Unit - Create 1 Dummy Light (Effect) for (Owner of Caster[(Integer A)]) at PointDLAMove[(Integer A)] facing Default building facing degrees[U][I]//Đồng thời tạo 1 dummy dạng effect ở điểm đấy để tạo đường sáng[/I][/U] 
    
                                            Set Group = (Units within 100.00 of PointDLAMove[(Integer A)] matching ((((((Matching unit) is alive) Equal to True) and ((Matching unit) Not equal to Caster[(Integer A)])) and (((Matching unit) has buff Holy Light ) Equal to False)) and ((((Matching unit) is Magic Immunne) Equal to False)) and ((Matching unit) has buff Invulnerable ) Equal to False))[U][I]//Đặt Group là các unit trong khoảng 100 range của đường sáng, bao gồm phải đang sống, không phải người cast, chưa buff holy light, chưa buff invunerable và không kháng phép ( không cần phải là unit địch vì skill có thể heal cả allies mà )[/I][/U] 
    
                                            If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                                                If - Conditions 
    
                                                    (Number of units in Group) Greater than 0[I][U]//Nêu số unit lớn hơn 0[/U], nghĩa là có tồn tại hơn 1 unit trong group thì chúng ta mới tiếp tục, không thì cứ pick và loop cẩu thả cũng làm "choáng" bộ nhớ chứ nhỉ[/I] 
    
                                                Then - Actions 
    
                                                    Unit Group - Pick every unit in Group and do (Actions) 
    
                                                        Loop - Actions 
    
                                                            Unit - Order DummyLightAOE[(Integer A)] to Human Mountain King - Storm Bolt (Picked unit)[U][I]//Skill này sẽ tỏa ra 1 tia sáng khác vào đối phương[/I][/U] 
    
                                                            Unit - Order DummyLightAOE[(Integer A)] to Human Sorceress - Slow (Picked unit)[U][I]//Skill này sẽ tạo 1 buff vào đối phương để tiện cho việc check[/I][/U] 
    
                                                Else - Actions 
    
                                            Set Integer[(Integer A)] = (Integer[(Integer A)] - 1)[U][I]//Tiếp tục giảm chỉ số này nếu bạn không muốn tia sáng phát ra "mãi mãi" chứ nhỉ?[/I][/U] 
    
                                            Custom script:   call RemoveLocation(udg_PointDLA[bj_forLoopAIndex]) 
    
                                            Custom script:   call RemoveLocation(udg_PointDLAMove[bj_forLoopAIndex]) 
    
                                            Custom script:   call DestroyGroup(udg_Group) 
    
                                        Else - Actions[I]//Khi chỉ số này không còn lớn hơn 1 nữa (tức = 1)[/I] 
    
                                            If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                                                If - Conditions 
    
                                                    Integer[(Integer A)] Greater than 0[U][I]//Và đây là sau 1 khoảng thời gian, khi chỉ số integer của chúng chỉ còn 1 ( lớn hơn 0 mà ), ta thấy rằng chỉ số này đã giảm đi rất nhiều, và lúc này chỉ bằng 1 vài dòng code nữa cộng với việc hạ chỉ số xuống còn "0" thì spell của chúng ta đã hoàn tất[/I][/U] 
    
                                                Then - Actions 
    
                                                    Set PointDLA[(Integer A)] = (Position of DummyLightAOE[(Integer A)])[U][I]//Xác định lần cuối vị trí của dummy này trước khi remove nó để deal damage xung quanh nơi ấy[/I][/U] 
    
                                                    Set Group = (Units within 400.00 of PointDLA[(Integer A)] matching ((((Matching unit) is alive) Equal to True) and (((((Matching unit) is Magic Immune) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of Caster[(Integer A)])) Equal to True)) and (((Matching unit) has buff Invulnerable ) Equal to False)))[U][I]//Như ở trên, có điều thêm phần unit này là địch vì đây chỉ là deal damage thôi[/I][/U] 
    
                                                    If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                                                        If - Conditions 
    
                                                            (Number of units in Group) Greater than 0 
    
                                                        Then - Actions 
    
                                                            Unit Group - Pick every unit in Group and do (Actions) 
    
                                                                 Loop - Actions 
    
                                                                    Unit - Cause Caster[(Integer A)] to damage (Picked unit), dealing (100.00 + ((Real((Level of Holy Light  for Caster[(Integer A)]))) x 25.00)) damage of attack type Spells and damage type Normal[U][I]//Pick và deal damage theo lvl, chắc ai cũng hiểu[/I][/U] 
    
                                                        Else - Actions 
    
                                                    Special Effect - Create a special effect at PointDLA[(Integer A)] using war3mapImported\LightNova.mdx 
    
                                                    Special Effect - Destroy (Last created special effect)[U][I]//Effect ánh sáng nổ ở cuối đường[/I][/U] 
    
                                                    Unit - Remove DummyLightAOE[(Integer A)] from the game 
    
                                                    Custom script:   call RemoveLocation(udg_PointDLA[bj_forLoopAIndex]) 
    
                                                    Custom script:   call DestroyGroup(udg_Group) 
    
                                                Else - Actions 
    
    
    -Vậy là xong phần spell Holly Light của hero. Nhưng để spell này hoàn chỉnh, chúng ta phải làm cả spell của dummy

    Mã:
    Light Target Dummy 
    
        Events 
    
            Unit - A unit Starts the effect of an ability 
    
        Conditions 
    
            (Ability being cast) Equal to Light Target 
    
        Actions 
    
            Set MUI[2] = (MUI[2] + 1) 
    
            Set LightTargetCaster[MUI[2]] = (Casting unit) 
    
            Set LightTargetUnit[MUI[2]] = (Target unit of ability being cast) 
    
            Set CasPointLightTarget[MUI[2]] = (Position of LightTargetCaster[MUI[2]]) 
    
            Unit - Create 1 Dummy Light (Target) for (Owner of LightTargetCaster[MUI[2]]) at CasPointLightTarget[MUI[2]] facing Default building facing degrees 
    
            Set DummyLightTarget[MUI[2]] = (Last created unit) 
    
            Set IntegerDummy[MUI[2]] = 2[U][I]//Đặt chỉ số này = 2 vì spell tia sáng chỉ kết thúc khi đến được điểm của Target[/I][/U] 
    
            Countdown Timer - Start TimerLightTarget as a Repeating timer that will expire in 0.01 seconds 
    
    
    -Phần này chắc không có gì để nói, y hệt như Holy Light ngoại trừ thêm phần set Target, có điều bạn phải dùng MUI[2] để không trùng với MUI[1] (có nghĩa nếu để MUI[1] hết thì spell Holy Light có thể lặp nhiều lần và ngược lại --> bug)

    Mã:
    Light Target Move 
    
        Events 
    
            Time - TimerLightTarget expires 
    
        Conditions 
    
        Actions 
    
            For each (Integer A) from 1 to MUI[2], do (Actions) 
    
                Loop - Actions 
    
                    If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                        If - Conditions 
    
                            IntegerDummy[(Integer A)] Greater than 1[U][I]//Vừa vào đã "greater than 1", hơi khác phải không ? Vì chỉ số này chỉ giảm xuống còn 1 khi dummy đứng gần Target nhất[/I][/U] 
    
                        Then - Actions 
    
                            Set PointDLT[(Integer A)] = (Position of DummyLightTarget[(Integer A)]) 
    
                            Set TarPointLightTarget[(Integer A)] = (Position of LightTargetUnit[(Integer A)]) 
    
                            Set PointDLTMove[(Integer A)] = (PointDLT[(Integer A)] offset by 15.00 towards (Angle from PointDLT[(Integer A)] to TarPointLightTarget[(Integer A)]) degrees) 
    
                            Unit - Move DummyLightTarget[(Integer A)] instantly to PointDLTMove[(Integer A)] 
    
                            Unit - Create 1 Dummy Light (Effect) for (Owner of LightTargetCaster[(Integer A)]) at PointDLTMove[(Integer A)] facing Default building facing degrees 
    
    [U][I]-Phần trên hoạt động y hệt như Holy Light, ngoại trừ phải set thêm point Target[/I][/U] 
    
                            If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                                If - Conditions 
    
                                    (Integer((Distance between PointDLTMove[(Integer A)] and TarPointLightTarget[(Integer A)]))) Less than or equal to 16[U][I]//Đây là phần quan trọng chuyển sang giai đoạn kế tiếp, deal damage. Nếu khoảng cách giữa dummy và target dưới hoặc bằng 16, trong game có nghĩa là tia sáng đã đến sát nút unit địch, thì việc giảm chì số Integer sẽ hoạt động.[/U] Nên để khoảng cách này = khoảng cách move dummy của bạn +1 nghĩa là 15+1=16, đây là ý kiến riêng của mình thôi.[/I] 
    
                                Then - Actions 
    
                                    Unit - Order DummyLightTarget[(Integer A)] to Human Sorceress - Slow LightTargetUnit[(Integer A)][U][I]//Tạo buff check[/I][/U] 
    
                                    If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                                        If - Conditions 
    
                                            (LightTargetUnit[(Integer A)] belongs to an enemy of (Owner of LightTargetCaster[(Integer A)])) Equal to True[U][I]//Nếu là địch thì sẽ deal damage = 100, ngược lại allies thì bạn cho deal -100, tức là thêm lượng HP tương đương vơi 100 damage[/I][/U] 
    
                                        Then - Actions 
    
                                            Unit - Cause LightTargetCaster[(Integer A)] to damage LightTargetUnit[(Integer A)], dealing 100.00 damage of attack type Spells and damage type Normal 
    
                                        Else - Actions 
    
                                            Unit - Cause LightTargetCaster[(Integer A)] to damage LightTargetUnit[(Integer A)], dealing -100.00 damage of attack type Spells and damage type Normal 
    
                                    Set IntegerDummy[(Integer A)] = (IntegerDummy[(Integer A)] - 1)[U][I]//Giảm chỉ số Int[/I][/U] 
    
                                    Special Effect - Create a special effect at TarPointLightTarget[(Integer A)] using Abilities\Spells\Human\HolyBolt\HolyBoltSpecialArt.mdl[U][I]//tạo effect tại điểm của target[/I][/U] 
    
                                    Special Effect - Destroy (Last created special effect) 
    
                                Else - Actions 
    
                            Custom script:   call RemoveLocation(udg_PointDLT[bj_forLoopAIndex]) 
    
                            Custom script:   call RemoveLocation(udg_PointDLTMove[bj_forLoopAIndex]) 
    
                            Custom script:   call RemoveLocation(udg_TarPointLightTarget[bj_forLoopAIndex]) 
    
                        Else - Actions 
    
                            If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                                If - Conditions 
    
                                    IntegerDummy[(Integer A)] Greater than 0[U][I]//Và sau cùng, kết thúc khi Int chỉ còn 1, nhưng lại mở ra 1 đường đi mới, spell sẽ tỏa ra 2 đường sang 2 địch kế bên, đường thứ nhất sẽ tỏa vào địch trong 600 range, đường thứ 2 sẽ tỏa trong 350 range, và 2 unit này sẽ không trùng nhau, chỉ số range ở đây khác nhau để giảm đi sự "imba" [/U](Theo lý thuyết thì lượng ánh sáng sẽ giảm bớt khi bị tỏa ra, bằng nhau hoặc 1 mạnh 1 yếu)[/I] 
    
                                Then - Actions 
    
                                    Set PointDLT[(Integer A)] = (Position of DummyLightTarget[(Integer A)]) 
    
                                    Set Group = (Units within 600.00 of PointDLT[(Integer A)] matching (((((Matching unit) is alive) Equal to True) and (((Matching unit) has buff Holy Light ) Equal to False)) and ((((Matching unit) is Magic Immune) Equal to False) and (((Matching unit) has buff Invulnerable)[U][I]//Unit trong range 600 thỏa với các điều kiện trên[/I][/U] 
    
                                    If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                                        If - Conditions 
    
                                            (Number of units in Group) Greater than 0 
    
                                        Then - Actions 
    
                                            Set RandomUnit = (Random unit from Group)[U][I]//Tạo 1 biến RandomUnit dạng unit để việc random unit không bị trùng[/I][/U] 
    
                                            Unit - Create 1 Dummy Light (AOE) for (Owner of LightTargetCaster[(Integer A)]) at PointDLT[(Integer A)] facing Default building facing degrees[I]//Dummy này ta đã gặp trong phần Holy Light, nếu ở spell trên nó đảm nhiệm chức vụ chính thì ở đây nó chỉ có vai trò phụ. [U]Dummy này có skill Light Targer để tiếp tục việc "tỏa" tia sáng ra[/U][/I] 
    
                                            Unit - Add a 1.00 second Generic expiration timer to (Last created unit)[U]//Cho unit này tồn tại trong 1s đủ để cast spell nếu bạn không muốn bị lag do nhiều unit được tạo ra[/U] 
    
                                            Unit - Order (Last created unit) to Human Mountain King - Storm Bolt RandomUnit[U][I]//Light Target base trên Storm Bolt nên..?[/I][/U] 
    
                                        Else - Actions 
    
                                    Custom script:   call DestroyGroup(udg_Group) 
    
                                    Set Group = (Units within 350.00 of PointDLT[(Integer A)] matching (((((Matching unit) is alive) Equal to True) and (((Matching unit) has buff Holy Light ) Equal to False)) and (((((Matching unit) is Magic Immune) Equal to False) and ((Matching unit) Not equal to RandomUnit))))[I][U]//Hệt như phần trên có đều thêm 1 điều kiện quan trọng là unit này KHÔNG PHẢI là RandomUnit[/U] (tránh cho việc trùng lặp)[/I] 
    
                                    If (All Conditions are True) then do (Then Actions) else do (Else Actions) 
    
                                        If - Conditions 
    
                                            (Number of units in Group) Greater than 0 
    
                                        Then - Actions 
    
                                            Unit - Create 1 Dummy Light (AOE) for (Owner of LightTargetCaster[(Integer A)]) at PointDLT[(Integer A)] facing Default building facing degrees 
    
                                            Unit - Add a 1.00 second Generic expiration timer to (Last created unit) 
    
                                            Unit - Order (Last created unit) to Human Mountain King - Storm Bolt (Random unit from Group)[U][I]//Lần này không cần set nữa, random unit nào cũng được vì nó không thể trùng unit nữa[/I][/U] 
    
                                        Else - Actions 
    
                                    Custom script:   call DestroyGroup(udg_Group) 
    
                                    Set RandomUnit = No unit 
    
                                    Unit - Remove DummyLightTarget[(Integer A)] from the game[I]//Tất nhiên phải remove rồi[/I] 
    
                                    Set IntegerDummy[(Integer A)] = (IntegerDummy[(Integer A)] - 1)[U][I]//Giảm chỉ số Integer, kết thúc spell[/I][/U] 
    
                                    Custom script:   call RemoveLocation(udg_PointDLT[bj_forLoopAIndex]) 
    
                                    Custom script:   call RemoveLocation(udg_CasPointLightTarget[bj_forLoopAIndex]) 
    
                                Else - Actions 
    
    
    Và một lần nữa mình xin nhắc lại, nhớ remove leak sau mối lần set point, group :)[/spoil]
    Ps: Mình cũng hay đùa giỡn ( nói chung là rất nhiều ) nhưng mình lại không thích đùa trong việc xưng hô, giao tiếp. Với lại hôm đó mình cũng đang bực bội nên một phần cũng do mình không đúng, thôi thì giảng hòa, xí xóa mọi việc xem như chẳng có gì xảy ra vậy nhé và quay lại với topic nào.
     
  12. WordEditor

    WordEditor Thành viên cấp 5

    Tham gia ngày:
    8/9/08
    Bài viết:
    1,509
    Nơi ở:
    Leaf Village
    Hết ngày hôm nay là hết hạn nộp bài rồi, các thí sinh nhanh chân lên nào... :-t
     
  13. WordEditor

    WordEditor Thành viên cấp 5

    Tham gia ngày:
    8/9/08
    Bài viết:
    1,509
    Nơi ở:
    Leaf Village
    Chủ topic đâu rồi nhỉ...vào "chấm điểm" và đưa ra nhận xét xem nào...:-s
     
  14. dragonkight123

    dragonkight123 Thành viên mới

    Tham gia ngày:
    21/2/11
    Bài viết:
    9
    sao ko ai dzo huong ung the :S
    cho newbie nhu minh hoc hoi voi :D
     
  15. raivor

    raivor Thành viên cấp 5

    Tham gia ngày:
    24/7/09
    Bài viết:
    1,337
    Chủ topic dạo này bận lắm :(. Nên nhờ mấy bạn chấm điểm dùm, 2 cái đề kia mình sẽ đưa lên #1, đến khi nào mình rãnh (khoảng 1, 2 tháng gì đó) thì mình sẽ vào cho đề mới. Và chọn giám khảo. Trong thời gian mình vắng mặt mong bác Shadow vào cho đề. Cảm ơn các bạn. :)
     
  16. raivor

    raivor Thành viên cấp 5

    Tham gia ngày:
    24/7/09
    Bài viết:
    1,337
    Tên Spell: ThunderClap
    Mô tả: Khi hero cast spell, các unit sẽ nhận một lượng dmg, bị slow as, ms và bị văng lên cao.
    Hình ảnh:
    [spoil][​IMG][/spoil]

    Các biến:
    - Caster: Unit
    - Group: Unit Group
    - Height, Rate: Real
    - Point: Point

    Trigger 1:
    Mã:
    ThunderClap
        Events
            Unit - A unit Starts the effect of an ability //Khi một unit cast spell thì....
        Conditions
            (Ability being cast) Equal to (==) Thunder Clap //Spell đó phải là Thunder Clap
        Actions
            Set Caster = (Triggering unit) //Gán hero cast Thunder Clap (tức hero tạo ra sự kiện(Event) cho biến Caster
            Set Point = (Position of Caster) //Gán vị trí của Caster vào biến Point 
            Set Height = 50.00 //Gán cho biến Height giá trị bằng 50
            Set Rate = 10.00 //Gán cho biến Rate giá trị bằng 10
            Set Group = (Units within (200.00 + (50.00 x (Real((Level of Thunder Clap for Caster))))) of Point matching ((((Matching unit) is A structure) Equal to (==) False) and ((((Matching unit) is Magic Immune) Equal to (==) False) and ((((Matching unit) is dead) Equal to (==) False) and (((Matching unit) belongs to an enermy of (Owner of Caster)) Equal to (==) True) //Gán những unit xung quanh vị trí của caster 200+(50xlv của Thunder Clap tức là thunder clap lv 1 sẽ có AoE là 250, lv 2 là 300 và lv 3 là 350) vào biến Group, và chúng ta còn phải thêm một vài điều kiện, những unit được gán không phải là một công trình, chúng cũng không phải là unit kháng phép, chúng phải còn sống và quan trọng nhất là chúng phải là kẻ thù của caster.
            Unit Group - Pick every unit in Group and do (Actions) //"Tóm" lấy các unit trong group và.....
                Loop - Actions
                    Unit - Pause (Picked unit) //Dừng mọi hành động của chúng lại.
                    Unit - Add Crow Form to (Picked unit) //Thêm spell Crow Form cho chúng để chúng có thể "bay" được.
                    Unit - Remove Crow Form from (Picked unit) //Xóa nó đi ngay lập tức.
            Trigger - Turn on Bounce <gen> //Mở trigger Bounce lên.
    Trigger 2: (Initally On => Off)
    Mã:
    Bounce
        Events
            Time - Every 0.04 seconds of game time //Cứ mỗi 0.04s thì trigger này lại chạy (nếu được mở bởi trigger kia, còn không thì trigger này sẽ không chạy)
        Conditions
        Actions
            Unit Group - Pick every unit in Group and do (Actions) //"Tóm" các unit trong Group và.....
                Loop - Actions
                    Animation - Change (Picked unit) flying height to Height at 99999.00 //Bắt đầu thay đổi độ cao của chúng.
                    Set Height = (Height + Rate) //Height = Height + Rate = 50 + 10.
                    Set Rate = (Rate - 0.10) //Cứ mỗi lần trigger này chạy thì Rate sẽ bị trừ đi 0.1, như ở trên, độ cao sẽ tăng dần cho tới khi Rate < 0, nếu Rate < 0 thì độ cao sẽ giảm, tức là unit sẽ bị rơi xuống.
                    Special Effect - Create a special effect attached to the origin of (Picked unit) using Abilities\Spells\Human\FlakCannons\FlakTarget.mdl //Thêm hiệu ứng cho đẹp.
                    Special Effect - Destroy (Last created special effect) //Destroy hiệu ứng đó đi.
                     Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        If - Conditions
                            Height Less than or equal to (<=) 10.00 //Nếu Height <= 10 Tức là unit đã chạm đất thì....
                        Then - Actions
                            Unit - Cause Caster to damage (Picked unit), dealing (50.00 x (Real((Level of Thunder Clap for Caster)))) damage of attack type Spells and damage type Normal // Deal dmg.
                            Unit - Unpause (Picked unit) //Unit được hoạt động bình thường trở lại
                            Custom script:   call DestroyGroup(udg_Group) //Destroy Group.
                            Custom script:   call RemoveLocation(udg_Point) // Remove Point xóa leak.
                            Trigger - Turn off (This trigger) //Tắt trigger này đi để nó không chạy nữa.
                        Else - Actions
    Chúc thành công!
     

    Các file đính kèm:

  17. Dorae.Mun

    Dorae.Mun Thành viên cấp 5

    Tham gia ngày:
    9/11/11
    Bài viết:
    243
    Nơi ở:
    Thế kỉ 22
    em ko hiểu vài điều ở 2pic này:
    1. Spell đk post lên chỉ theo chủ đề??
    2. Spell bao gồm chỉ GUI?
    mong anh rai giải thích giúp em
     
  18. FlameDrake

    FlameDrake Thành viên cấp 5

    Tham gia ngày:
    1/12/10
    Bài viết:
    1,298
    Nơi ở:
    Quận 10 HCM
    Hiện tại Rai đang giới thiệu các newbie lại cách làm spell từ nhũng spell đơn giản nhất ( Thunder Clap ở trên ) = GUI trước, tham khảo cho hĩu các cơ cấu đơn giản đi sau đó Rai sẽ chuyển wa MUI.
    Ai cũng có thể post spell lên để chia sẽ bình luật học hỏi thêm với nhau
     
  19. Dorae.Mun

    Dorae.Mun Thành viên cấp 5

    Tham gia ngày:
    9/11/11
    Bài viết:
    243
    Nơi ở:
    Thế kỉ 22
    vậy em có thể đưa các spell ko dành cho newbie đc ko ạ? :| ... mấy dạng timer loop đó?!!
     
  20. Bạo Cuồng Long

    Bạo Cuồng Long Thành viên cấp 5

    Tham gia ngày:
    22/8/10
    Bài viết:
    694
    [spoil]
    [/spoil]

    Ai còn giữ spell trên send mình nhé link trên chết rồi. :) :Thanks
     

Chia sẻ trang này