[Tutorial] How to make custom Auto-Cast spells

Tom_Kazansky

<b><font color="RoyalBlue"><font face="Lucida Cons
Tom sẽ hướng dẫn lại cách tạo 1 auto cast spell. Cụ thể là spell Impetus (DotA)

Impetus: hero làm mục tiêu mất nhiều máu hơn, phụ thuộc vào khoảng cách giữa hero và mục tiêu

---
Đầu tiên, vào Object Editor:
- Buffs/Effects: tạo 1 custom buff, base từ Poison (stacking). Đổi tên, đổi icon...
- Abilities: tạo 1 custom ability, base từ Poison Arrows (tìm thấy trong abilities của Neutral Hostile). Chỉnh lại các dữ liệu của Poison Arrows như sau:
Icon: ReplaceableTextures\CommandButtons\BTNImpalingBolt.blp
attachment.php


Sau đó vào Trigger Editor:

Tôi sẽ nói sơ qua cách làm như sau: Ta phải có 1 trigger mà trigger này sẽ hoạt động khi 1 unit "take damage" (nhận sát thương). Và nếu unit đó có buff Impetus thì sẽ deal thêm damage, phụ thuộc vào khoảng cách giữa unit đó và thằng deal dam (Damage Source).
Chú ý: Cho dù spell này đc cast hay để auto (attack ấy) thì nếu đánh trúng thì unit sẽ có buff, cho nên ko lo lỗi gì cả, mà hoàn toàn MUI. Vì khi có buff, ta sẽ remove buff đó luôn, và có Damage Source rõ ràng nên ko lo 2 unit đánh 1 unit sẽ nhầm lẫn.

Vì trigger ko có event: "Generic unit take damage" chỉ có "Specific unit take damage". Nên ta sẽ pick từng unit rồi add event cho trigger cần dùng, pick unit là "specific" rồi đó.

Trigger thứ 1:
attachment.php

Ta cần 2 biến unit group, TempGroup và TakeDamGroup. Khi 1 unit đã có event take damage rồi thì phải add vào TakeDamGroup (để biết là nó "đã có event") nếu add event 2 lần thì sẽ lỗi, unit đó sẽ take 2 lần damage.
Trigger này để add event cho các unit đã đc đặt sẵn.

attachment.php

Trigger này là khi 1 unit "đi" vào bản đồ, cho dù là đc summon, create (trigger),... Tất nhiên vẫn phải kiểm tra xem unit này đã ở trong TakeDamGroup chưa, nếu chưa thì mới add. (cẩn thận vẫn hơn)

attachment.php


Trigger này là trigger chính đây.
Variable:
TempUnit, TempUnit2 - unit,
TempLoc, TempLoc2 - point
TempInt - integer
TempReal - real

Trigger này chưa có event, nhưng event đã đc add nhờ 2 trigger trên. Bây giờ có "event a unit takes damage" rồi.
Đối với event này thì có: (Triggering unit) là unit bị mất máu (một trong những unit đã add event ấy). (Damage source) là unit deal damage.

Trước hết phải turn off trigger này, rồi turn on sau khi xong. Ko turn off sẽ có chuyện ko hay xảy ra.
Sau đó kiểm tra xem Damage source có ability Impetus ko (level > 0), rồi kiểm tra Triggering unit có buff ko. (thật ra chỉ cần điều kiện này thôi, ko cần nhiều)
Nếu Trigger unit có buff, tức là bị Damage source làm mất máu khi dùng Impetus. Vậy ta sẽ cho Damage source deal thêm damage theo khoảng cách giữa 2 unit này. Có số damage rồi thì dùng floating text để show và dùng Unit - Damage Target để deal damage thôi. Nhớ là pure damage thì nên dùng ATTACK_TYPE_CHAOS và DAMAGE_TYPE_UNIVERSAL.

Đến đây thì đã xong rồi, từ cách làm này các bạn có thể tạo các auto cast spell mà mình muốn. Hoặc vài spell như trong DotA: Glaive of Wisdom (deal damage = % Int ) Arcane Orb (deal damage = % current mana)
----



-----
BONUS SPELLS:

Thêm 1 spell nữa nhá. Ai chơi DotA 6.53 rồi sẽ biết Magina ( Anti Mage ) có cái blink rất "ảo" (nhiều người cho rằng rất "cool", tôi cũng nghĩ thế, chỉ hơi thiếu tí sound thôi)

Ta cần các biến sau:
InstantMovementCaster, InstantMovementDummy - unit //caster và dummy
InstantMovementFade - real //đây là biến đếm cho việc "mờ" của dummy và caster
InstantMovementBlink - boolean //biến này để kiểm tra xem caster đã cast xong chưa, xong rồi thì mới hiện dummy và bắt đầu "mờ" dummy, caster.

Cần 4 trigger ( :| )
Mã:
InstantMovementBegin
    Events
        Unit - A unit Begins casting an ability
    Conditions
        (Ability being cast) Equal to Instant Movement 
    Actions
        Set InstantMovementCaster = (Casting unit)
        Set TempLoc = (Position of InstantMovementCaster)
        Set TempLoc2 = (Target point of ability being cast)
        Unit - Create 1 Dummy Instant Movement for (Owner of InstantMovementCaster) at TempLoc facing (Angle from TempLoc to TempLoc2) degrees
        Set InstantMovementDummy = (Last created unit)
        Animation - Play InstantMovementDummy's spell throw animation
        Animation - Change InstantMovementDummy's vertex coloring to (100.00%, 100.00%, 100.00%) with 100.00% transparency
        Custom script:   call RemoveLocation( udg_TempLoc )
        Custom script:   call RemoveLocation( udg_TempLoc2 )
Vì vấn đề animation nên ta phải tạo dummy ngay từ lúc caster bắt đầu cast. Nhưng lúc này phải cho transperency của dummy = 100% (ko nhìn thấy gì) và bắt dummy thực hiện động tác (animation) "spell throw" như caster.
Mã:
InstantMovementBlink
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to Instant Movement 
    Actions
        Set InstantMovementFade = 50.00
        Set InstantMovementBlink = True
        Animation - Change InstantMovementCaster's vertex coloring to (100.00%, 100.00%, 100.00%) with 50.00% transparency
        Animation - Change InstantMovementDummy's vertex coloring to (100.00%, 100.00%, 100.00%) with 50.00% transparency
        Trigger - Turn on InstantMovementTimer <gen>
Start effect, tức là đã caster đã cast xong (bây giờ đã move rồi). Vậy thì hiện dummy ra với 1 nữa transperency và caster cũng phải "mờ" đi 1 nửa. Bậy trigger "mờ" dummy và caster lên. Nhớ rằng biến InstantMovementBlink phải = true (vì đã cast xong)
Mã:
InstantMovementStop
    Events
        Unit - A unit Stops casting an ability
    Conditions
        (Ability being cast) Equal to Instant Movement 
    Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                InstantMovementBlink Equal to False
            Then - Actions
                Unit - Remove InstantMovementDummy from the game
            Else - Actions
stop casting là dừng cast, có thể là cast xong, có thể là bị stun chẳng hạn, nói chung là bị interrupt (gián đoạn :|, "cắt cơn" ấy :'> ) Nếu chưa cast xong thì remove dummy, ko thì thôi.
Mã:
InstantMovementTimer
    Events
        Time - Every 0.01 seconds of game time
    Conditions
    Actions
        Set InstantMovementFade = (InstantMovementFade + 1.00)
        Animation - Change InstantMovementCaster's vertex coloring to (100.00%, 100.00%, 100.00%) with (100.00 - InstantMovementFade)% transparency
        Animation - Change InstantMovementDummy's vertex coloring to (100.00%, 100.00%, 100.00%) with InstantMovementFade% transparency
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                InstantMovementFade Equal to 100.00
            Then - Actions
                Unit - Remove InstantMovementDummy from the game
                Trigger - Turn off (This trigger)
            Else - Actions
Sau khi cast xong thì bật trigger này, cứ 0.01s dummy sẽ mờ đi 1% và caster sẽ hiện rõ hơn 1%.

50 + 1 = 51 -> 100 - 50 = 49 => số này nhỏ dần, caster sẽ hiện ra dần dần

Khi InstantMovementFade = 100 tức là dummy đã mờ hẳn và caster đã hiện ra rõ hẳn.

Đến đây đã xong.

PS: à mà spell này ko MUI nhg tôi nghĩ blink chỉ trong 0.33s nên ko có vấn đề gì to lớn. Mà nếu ko chắc thì có lẽ tôi sẽ nghĩ ra cách làm cho MUI.
---
Hy vọng mọi người hiểu.

Tom đã gửi kèm map demo.
 

Attachments

  • Trig1.JPG
    Trig1.JPG
    22.8 KB · Đọc: 1,145
  • Trig2.JPG
    Trig2.JPG
    16.9 KB · Đọc: 1,107
  • Trig3.JPG
    Trig3.JPG
    71.4 KB · Đọc: 1,111
  • Impetus.JPG
    Impetus.JPG
    113.5 KB · Đọc: 1,122
  • [Demo]AutoCast.rar
    [Demo]AutoCast.rar
    16.2 KB · Đọc: 559
Mô phật :D 1 skill auto cast làm = 4 trigger.Em nghĩ newbie không có đủ kiên nhẫn đâu anh Tom ới ời.Skill nhảy từ point này tới point kia, làm hiệu ứng nhảy lên của chém điên [mà nhảy từ point này sang point kia chứ ko chỉ nhảy lên] khi đạt tới pointkia thì nó xả kiếm xuống, nổ cái bùm dưới chân và đất lõm xuống trong 1 s .Trong lúc nhảy có phoenix fire trong người để cho người ta thấy đường vòng cung di chuyển. Chiêu đó 3 trigger, thằng đệ của em nó đòi xin map để học nhưng mà khi thấy vậy nó nản ngay, nói gì tới 4 trigger thì...
 
Sao lại 4 trigger, cái auto cast có 3 trigger thôi. Trigger thứ 3 là trigger chính. Mà tất cả spell auto cast cho vào 1 trigger thứ 3 là đc.

4 trigger kia là cái spell Instant Movement đấy chứ.
 
à anh ! trong pick unit có vụ pick con gần con mình rồi match nó là matching unit equal to an illusion >>> em định làm chiêu ảo ảnh, tức là khi tạo ra các con phân thân thì mình sẽ pick lũ đó, rồi mỗi 0.5 s thay đổi sự mờ ảo của nó ,thay đổi màu sắc nó , cho chiêu đó 1 effect thật mờ ảo đúng như ý định của skill : làm confuse địch. Nhưng không thể pick đc. Tại sao nhỉ .Em đã cẩn thận set con caster là 1 biến, sau 2 giây mới pick đám xung quanh con caster [vì thời gian cast phân thân lâu mà ] và đám đó phải là illusion mới pick rồi khi pick đc sẽ đưa chúng vào 1 unit group để trigger 2 sẽ thay đổi độ mờ ảo và màu sắc của chúng . thế mà chẳng pick đc con nào cả >>>> ????

Còn nữa ,đã chơi qua HAVOC của anh, thấy hệ thống giấu hero info rất hay, anh chỉ em làm đc ko ?

@ PS : mọi người hãy xem qua topic memory leak của anh Tom nếu chưa xem :D
 
Còn em thì làm theo kiểu này khác anh Tom, với kiểu em làm chỉ cần dùng 2 trigger thôi , nhưng chỉ hoạt động lúc auto cast , kô hoạt động khi ta cast spell

Vi dụ , em tạo 1 skill với tên Frost arrows : Gắn ảnh hưởng của băng vào mỗi phát tấn công , làm chậm và deal thêm damage các unit trong aoe qui định sẵn (Khi bắn thì tất cả các unit quanh unit bị bắn đều bị frost nova:D)

Việc cần làm bây h là tạo 1 skill Cold arrows , hạ hết thông số để nó trở thành skill mượn nhưng chú ý sửa :
++Text - Order String - Turn off : uncoldarrows
++Text - Order String - Use/Turn on : coldarrows
Rồi tạo ra 1 skill frost nova cho unit , tạo 1 dummy unit kô có model

Trigger1 : Order
---Event : A unit is issued an order with no target
---Condition : để kô
---Action :
++If (Issued order) equal to (order(coldarrrows)) then Trigger - Turn on Frost arrows
++If (Issued order) equal to (order(uncoldarrrows)) then Trigger - Turn off Frost arrows

Trigger2 :Frost arrows ( Tạo hai biến : Attacking và Attacked đều là kiểu unit)
---Event : A unit is a attacked
---Condition :
+Level of Frost arrows for attacking unit great than or equal to 1
+Mana of attacking unit great than or equal to *lượng mana tối thiểu còn phóng được skill Frost nova*
---Action
++Set Attacking = (Attacking unit)
++Set Attacked= (Attacked unit)
++Wait ((Distance between (Position of Attacking) and (Position of Attacked))/*Tốc độ đạn bay của Hero*) second *Đợi cái missel của hero vừa bay tới attacked unit*:D
++Bắt tất cả unit trong phạm vi 180 Aoe của Attacked với điều kiện .....
+Tạo 1 con Dummy unit tại vị trí Attacked
+Set thời gian sống 1s
+Add skill Frost nova cho last created unit
+Set level của Frost nova cho last created unit to level của skill Frost arrows cho Hero
+Order last created unit bắn frost nova lên các picked unit.
Em có làm thư rồi và thấy nó hoat động khá tốt
Mấy anh coi thử được hem ...;;);;)
 
@bonongvodoi, cách của em có vài điểm cần lưu ý:
thứ 1: event như vậy, sẽ có rất nhiều người "spam" skill này. khi hero vung kiếm (:D minh họa thôi, tức là đánh nhưng mục tiêu chưa mất máu :D) thì stop hero lại -> trigger vẫn hoạt động -> chuyện gì xảy ra chắc em biết rồi.
thứ 2: wait như vậy ko chính xác, nếu unit bị đánh chạy ra xa hay vào gần em thì sao ?
thứ 3: chưa có trigger hero này cast Frost Arrow như 1 spell. (manual cast , not auto )
 
Hì hì
Thứ 1 , đúng là em hơi sai thật , nhưng mà thôi cũng tạm chấp nhận được , bởi vì có thằng nào bít đâu mà spam , trừ khi nó đọc và hỉu được trigger em là thôi

Thứ 2 , hè hè , sorry các pác , ở nhà em text với mấy thằng lính đứng yên , nên thấy thời gian nó nổ nova rất chính xác , mà quên mất cái vụ nó chạy lung tung nữa ( cái này thì , em có thể tạo 1 buff mới trong cái skill cold arrows, rồi wait tới khi thằng attacked có buff đó rồi nổ nova cũng ổn :D)

Thứ 3 , thì em đã nói rồi , spell đó chỉ phục vụ cho auto cast thôi:D:D

Hì , mà thôi làm theo cách của ông anh tom là ổn nhất , em mới làm thử rồi , chuẩn xác vãi .....;;);;);;)
 
anh em có bít cách làm cho 1 trig làm cho khi attack thì add abi báh vô tới khi đánh phát tiếp thì remove abi đó đi ko
 
anh em có bít cách làm cho 1 trig làm cho khi attack thì add abi báh vô tới khi đánh phát tiếp thì remove abi đó đi ko
- Cậu này thật pó tay.Câu hỏi của cậu cũng chính là câu trả lời chứ gì nữa ?

event là a unit is attacked

condittions : attacking unit has ability of type [???]

actions : if then else:
if intenger shootflag = 1
then
shootflag = 0
add ability [??] to attacking unit
else shootflag = 1
remove ability [??] from attacking unit

tóm tắt họat động : khi bắn 1 phát , nếu shootflag = 0 [thì ban đầu nó = 0 mà ] thì cho nó = 1 và remove ability [??] , bắn phát tiếp theo [lúc này shootflag đã = 0 rồi ] thì add ability [??] của cậu vào. =))

P/S : đây đâu phải auto cast ???
 
vít ra đành hoàng đi khó hỉu wá.....
p/s tui làm cái này là do rỗi hơi muốn lấy base là frost arrow biến thành poison arrow( mặc dù WE đã có sẵn):D:D:D:D:D:D:D:D...thanks trước nha
 
vít ra đành hoàng đi khó hỉu wá
- Mô phật :o ! đưa cả cái trigger ra chình ình mà phán câu xanh rờn vậy ? Quyết tâm ko bao giờ chỉ tên này nữa .Chỉ chuốc bực vào thân X(
 
Còn nữa ,đã chơi qua HAVOC của anh, thấy hệ thống giấu hero info rất hay, anh chỉ em làm đc ko ?

Giấu cái chó gì ?8-}
Tại ổng tự viết custom battle system, cái default của WE đọc ko ra, chỉ hiển thị dmg : 0-0, armor : 0, nên ổng bực quá tắt đi đó chứ =))
 
Giấu cái chó gì ?8-}
Tại ổng tự viết custom battle system, cái default của WE đọc ko ra, chỉ hiển thị dmg : 0-0, armor : 0, nên ổng bực quá tắt đi đó chứ =))

:D giấu cái mèo gì....như trên
 
anh Tom ơi muốn làm 1 skill auto - cast melee thì sao ạ?

Tương tự thôi, nhưng có lẽ dùng Black Arrow. (ko lo về cái effect gọi xương hay unit chết bị mất xác, khi nó take dam mà có thể chết thì chưa chết ngay đâu, remove buff luôn có lẽ ko sao, anh nghĩ thế :| )
 
Tương tự thôi, nhưng có lẽ dùng Black Arrow. (ko lo về cái effect gọi xương hay unit chết bị mất xác, khi nó take dam mà có thể chết thì chưa chết ngay đâu, remove buff luôn có lẽ ko sao, anh nghĩ thế :| )

Cách hay nhất là xài ability của mấy cái orb :>
 
Phần Action không có lệnh bắt dummy unit dùng skill custom mình mới tạo à:(
 
Đây nè,mình định làm skill auto blizzard tự động tạo 1 dummy unit cast blizzard tại chỗ mình target mà không biết sai chỗ nào.Ai check giùm với:(
 

Attachments

Đây nè,mình định làm skill auto blizzard tự động tạo 1 dummy unit cast blizzard tại chỗ mình target mà không biết sai chỗ nào.Ai check giùm với:(

Các lỗi:
- Về trigger:
Mã:
UnitTakeDamage
    Events
    Conditions
    Actions
        [B]Trigger - Turn off (This trigger)[/B] // (1)
        Set TempUnit = (Triggering unit)
        Set TempUnit2 = (Damage source)
        Set TempReal = (Damage taken)
        -------- Blizzard Rain --------
        Set TempInt = (Level of Blizzard Rain<arow>  for TempUnit2)
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                TempInt Greater than 0
                (TempUnit has buff Blizzard Rain ) Equal to True
            Then - Actions
                Unit - Remove Blizzard Rain  buff from TempUnit
                Unit - Create 1 Blizzard Rain Caster for (Owner of TempUnit2) at (Position of TempUnit) facing Default building facing degrees
                Unit - Set level of Blizzard Rain<auto>  for (Last created unit) to (Level of Blizzard Rain<arow>  for TempUnit2)
                [B]Special Effect - Create a special effect at (Position of TempUnit) using Abilities\Spells\Human\Blizzard\BlizzardTarget.mdl[/B] // (2)
                Unit - Order (Last created unit) to Human Archmage - Blizzard (Position of TempUnit)
                [B]Unit - Remove (Last created unit) from the game[/B] // (3)
            Else - Actions
(1) trigger này khi chạy phải turn off, sau đó làm gì đó xong thì turn on lại, vì nếu ko turn off, có chuyện sẽ xảy ra.
(2) tạo special effect xong ko destroy, leak
(3) tạo dummy unit xong lại remove luôn, sao nó cast Blizzard đc ? /:) Add expired timer thôi, 5 wave x 1s => add 5.1s là ổn

Ngoài ra còn point leak.
Cuối cùng, trigger sẽ như sau:
Mã:
UnitTakeDamage
    Events
    Conditions
    Actions
        Trigger - Turn off (This trigger)
        -------- ---------------------------- --------
        Set TempUnit = (Triggering unit)
        Set TempUnit2 = (Damage source)
        Set TempReal = (Damage taken)
        -------- Blizzard Rain --------
        Set TempInt = (Level of Blizzard Rain<arow>  for TempUnit2)
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                TempInt Greater than 0
                (TempUnit has buff Blizzard Rain ) Equal to True
            Then - Actions
                Unit - Remove Blizzard Rain  buff from TempUnit
                Set TempLoc = (Position of TempUnit)
                Unit - Create 1 Blizzard Rain Caster for (Owner of TempUnit2) at TempLoc facing Default building facing degrees
                Unit - Set level of Blizzard Rain<auto>  for (Last created unit) to (Level of Blizzard Rain<arow>  for TempUnit2)
                Unit - Add a 5.10 second Generic expiration timer to (Last created unit)
                Unit - Order (Last created unit) to Human Archmage - Blizzard TempLoc
                Custom script:   call RemoveLocation( udg_TempLoc )
            Else - Actions
        -------- ---------------------------- --------
        Trigger - Turn on (This trigger)

- Về Object:
Cái skill Blizzard của dummy, có Stats - Casting Time = 0 => skill nà sẽ bị hỏng, để default 1,
Dummy unit thì dùng Art - Model File là .mdl

Ngoài ra melee unit ko dùng Auto - Cast skill đc (Combat - Attack - Weapon Type: Melee, phải là Missile mới là range)

Rất tiếc là melee unit mà dùng Auto - Cast skill, cụ thể là Black Arrow thì cho dù đã deactive auto cast vẫn như đang auto - cast ::( và các skill auto cast khác thì hoàn toàn ko dùng đc.
-------------
Đã sửa map và gửi kèm ở dưới
 

Attachments

Quá hay,cám ơn anh.

Em cứ tưởng cho unit cast skill xong thì remove nó luôn cho đỡ tốn bộ nhớ:(

Về sau các skill tương tự thế này chỉ cần thay unit,thay spell,thacòn mấy cái trigger trên vẫn giữ lại được đúng không ạ?

Để làm thử chiêu auto moonsoon luôn:D

À anh có list mấy cái custom script đó không:|?

À làm sao cho con Sentry đó của em 1 tay bên trái cầm băng,1 tay bên phải cầm sét vậy.
 
Back
Top