Events
[COLOR="DimGray"]Time - Every 0.04 second of game time //mỗi 0.04s của game[/COLOR]
Conditions
Actions
[COLOR="Green"]Unit Group - Pick every unit in Group and do (Actions) //tóm tất cả unit trong nhóm "tự kỉ vì MUI"
Loop - Actions
Set Move[(Custom value of (Picked unit))] = (Move(Custom value of (Picked unit))] + 3.00) //[(Custom value of (Picked unit))] <<< cái gì đây??? Như ở trên, nó là giá trị tự biên được đặt = MUI, tại sao lại là Picked unit (tên bị tóm đây mà), như ở trên ta đã add "Last create unit" vào nhóm "tự kỉ vì MUI" nên khi tóm unit trong nhóm "tự kỉ vì MUI" thì dính hắn. Và ở trên có dòng "Unit - Set the [B][U]custon value of (Last created unit)[/U][/B] to MUI" đấy đấy, nó đấy. Vậy thì tóm lại, Custom value of (Picked unit) = MUI tức là cast lần đầu tiên thì Custom value of (Picked unit) = 1, lần thứ 2 thì Custom value of (Picked unit) = 2.... Vậy tại sao không dùng MUI luôn cho nó lành? Thực ra là như vầy, nếu ta dùng MUI thì trong trigger 2 MUI sẽ bị thay đổi giá trị nhanh chóng, vì ở Trigger 2 hệ thống check liên tục mỗi 0.04s, cụ thể là ở đây "Time - Every 0.04 second of game time"<<< nếu vậy thì khi cast lần thứ 2 MUI = 2 rồi :|, nhưng nếu dùng custom value of khỉgìđấy thì cast lần 2 sẽ xuất hiện 2 giá trị "tự biên" là Custom value of (Picked unit) [COLOR="White"]thứ nhất[/COLOR] = 1 và Custom value of (Picked unit) [COLOR="White"]thứ 2[/COLOR] = 2 => cả 2 cái cùng hoạt động. Vậy tại sao MUI lại không giữ được mà Custom value of khỉgìđấy lại giữ được? À, là bởi vì người ta quy định vậy đấy, biết vậy thôi, khỏi thắc mắc. Quay lại đoạn code, Move = Move + 3 (vậy thôi?)[/COLOR]
[COLOR="Navy"]Set Speed[(Custom value of (Picked unit))] = (Speed[(Custom value of (Picked unit))] + Speed2[(Custom value of (Picked unit))]) //Biến Speed = Speed + Speed2.
Set Speed2[(Custom value of (Picked unit))] = (Speed2[(Custom value of (Picked unit))] - 1.00) //Biến Speed2 = Speed2 - 1 = 0 - 1, mà Speed = 30 => Speed = 30 + (0-1).[/COLOR]
[COLOR="DimGray"]Set Point[(Custom value of (Picked unit))] = (Position of Caster[(Custom value of (Picked unit))]) //Biến Point = Vị trí của Caster. Như đã nói ở trên, do trigger chạy 1 lần trong 0.04s, vậy thì biến Point này sẽ được check 1 lần trong 0.04s tức là vị trí của caster được check 1 lần trong 0.04s.[/COLOR]
[COLOR="Green"]For each (Integer Integer[(Custom value of (Picked unit))] from 1 to 6, do (Actions) //Vòng lặp 6 lần, tức là phần nằm trong đoạn code này chạy vòng vòng 6 lần để lấy điểm kiểm tra môn thể dục.
Loop - Actions //nó là Loop - Actions (người ta viết vậy thì biết vậy)
Set Point2[(Custom value of (Picked unit))] = (Point[(Custom value of (Picked unit))] offset by Speed[(Custom value of (Picked unit))] towards ((60.00 x (Real(Integer[(Custom value of (Picked unit))]))) + Move[(Custom value of (Picked unit))]) degrees) //Biến Point2 = biến Point cách 1 khoảng Speed có cái góc là 60 x với số vòng chạy cộng với biến Move. Tức là như vầy, à mà là sao ta?? À là như vậy nè cái Point2 đó đó là cái vị trí của Caster (được check mỗi 0.04s, tội thằng bé) + với 30km với 1 góc là 60 x với 1 vòng nè, 2 vòng nè, 3 vỏng nè, 4 vòng nè , 5 vòng nè , 6 vòng nè + với 0 nè mà Move = Move + 3 nè, tức là Move = 3 nè rồi sau 0.04s thì Move = Move + 3 = 3 + 3 = 6 để rồi qua 0.04 sau thì Move = Move + 3 = 6 + 3 rồi sau 0.04s sau thì hết hơi nói nè... Tiếp nè, ((60.00 x (Real(Integer[(Custom value of (Picked unit))]))) + Move[(Custom value of (Picked unit))]) degrees) có nghĩa là khi ta chạy vòng thứ nhất thì Point2 được đặt ở góc 2h (0h là 0 độ, 60 độ là 2h), vòng thứ 2 thì sẽ là 60 độ x 2 thì Point2 được đặt ở góc 4h (0h là 0 độ, 120 độ là 4h), vòng thứ 3 thì sẽ là 60 độ x 3 thì Point2 được đặt ở góc 6h (0h là 0 độ, 180 độ là 6h), vòng thứ 4 thì sẽ là 60 độ x 4 thì Point2 được đặt ở góc 8h (0h là 0 độ, 240 độ là 6h), vòng thứ 5 thì sẽ là 60 độ x 5 thì Point2 được đặt ở góc 10h (0h là 0 độ, 300 độ là 10h), vòng thứ 6 thì sẽ là 60 độ x 6 thì Point2 được đặt ở góc 12h (0h là 0 độ, 360 độ là 12h mà 0h = 12h => 12h = 0 độ hay 0h = 350 độ). Vậy, lấy đâu ra 60 độ vậy? Là tại vì ta cho nó chạy 6 vòng, mà 360 / 6 bằng 60 độ, vì vậy, 10 vòng thì 360/10 là 36 độ. Nhưng, sao tự nhiên lại + Move? Ta có: Move = Move + 3 và nó cứ tăng dần nên vòng thứ nhất của 0.04s đầu tiên là 60 độ x 1 + 3 = 63 độ, tương tự vòng thứ 2 là 123, vòng thứ 3 là 183 rồi 243 rồi 303 rồi 363 hay 3 độ. Trong 0.04s sau thì vòng thứ nhất là 66 độ, vòng thứ 2 là 126 độ rồi 186 rồi 246 rồi 306 rồi 366 = "1 năm nhuận" tức 6 độ. Rồi sau 0.04s sau nữa nó sẽ như vậy tức là 69, 129 rồi .... Như vậy thì các Point2 sau mỗi 0.04s sẽ xoay theo chiều nào đó ai mà biết trên 1 đường tròn. (Xoay đều xoay đều xoay). Và vì nó cứ chạy ra xa và xoay nên đường kính vòng xoay càng rộng. Còn nữa, như mình đã nói, tốc độ rộng ra của đường kính là biến Speed = 30 mà Speed = Speed + Speed2 mà thêm cái nữa Speed2 = Speed2 - 1 do đó Speed = 30 - 1 rồi sau 0.04s Speed = 30 - 2 rồi 30 -3 như vậy khi Speed2 = 30 thì đường kính không rộng ra nữa, và ta áp dụng định lí "GIẬT LÙI" do tôi mới nghĩ ra thì Speed sẽ = số âm khi Speed2 > Speed => nó sẽ chạy ngược vô lại.[/COLOR]
[COLOR="Sienna"]Set DmgAoE[(Custom value of (Picked unit))] = (Units within 100.00 of Point2[(Custom value of (Picked unit))] matching ((((Matching unit) is A structure) Equal to Fasle) and ((((Matching unit) is Magic Immune) Equal to False) and ((((Matching unit is dead) Equal to False) and ((((Matching unit) belong to an ally of (Owner of Caster[(Custom value of (Picked unit))]) Equal to False //vùng gây dmg cho bọn unit xung quanh 100.00km(vuông) của Point2. " and and and Equal to False" Unit bị pick không phải là công trình "((((Matching unit) is A structure) Equal to Fasle)" và(and) unit bị pick không phải là unit kháng phép "((((Matching unit) is Magic Immune) Equal to False)" và(and) unit bị pick không chết tức là phải còn sống "((((Matching unit is dead) Equal to False)" và(and) unit bị pick không phải là đồng đội của "[COLOR="white"]tên đồi bại[/COLOR]" "((((Matching unit) belong to an ally of (Owner of Caster[(Custom value of (Picked unit))])"
Set Unit = (Picked unit) //Unit = (Picked unit) = tên tự kỉ bị tóm.[/COLOR]
[COLOR="Sienna"]Unit Group - Pick every unit in DmgAoE[(Custom value of (Picked unit))] and do [Actions] //chọn cái bọn bất hạnh trong vùng "GDCBUXQ100.00km(vuông)CP2"
Loop - Actions
Unit - Cause Caster[(Custom value of Unit)] to damage (Picked unit), dealing [B][U](10.00 x (Real(Level of Thunder Clap for Caster[(Custom value of Unit)]))))[/U][/B] damage of attack type Spells and damage type Normal //gây dmg bằng 10 x cho level của spell, level 1 thì gây 10 dmg, level 2 thì 20 dmg, level 3 bằng 30 dmg.[/COLOR]
[COLOR="Green"]Special Effect - Create a special effect at Point2[(Custom value of (Picked unit))] using Abilities\Weapons\VengeanceMissile\VengeanceMissile.mdl //Phần chính đây, vừa là sườn vừa tô màu. Tạo hiệu ứng ở Point2.[/COLOR]
[COLOR="Green"]Special Effect - Destroy (Last created special effect) //Hủy hiệu ứng, vì cái này mà chúng ta nên chỉ nên xem effect ở phần death animation.[/COLOR]
[COLOR="Green"]If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
Speed2[(Custom value of (Picked unit))] Less than or equal to -30.00 //Nếu Speed2 bằng -30 tức là Speed = 0 tức lả Point2 = (Point[(Custom value of (Picked unit))] = vị trí của caster .... còn phần sau mình dùng viết *gạch gạch* => bỏ, giờ nó chả còn nghĩa lí gì nữa vì nó về cùng 1 điểm thì góc này góc nọ làm gì???
Then - Actions
Unit Group - Remove (Picked unit) from Group //Tống tên bị tóm khỏi nhóm "tự kỉ vì MUI". (để lôi tên khác vào <<đừng hiểu nhầm, đã xóa rồi không biết có cần tống hắn đi không? Tội lỗi.)
Unit - Remove (Picked unit) from the game //Xóa tên bị tóm
Custom script: call RemoveLocation(udg_Point[GetUnitUserData(GetEnumUnit())])
Custom script: call RemoveLocation(udg_Point[GetUnitUserData(GetEnumUnit())])
Else - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Number of units in group) Equal to 0 //Khi cái nhóm "tự kỉ vì MUI" không còn đứa nào vì tụi nó đã hết bệnh.
Then - Actions
Trigger - Turn off (This trigger) //thì tắt trigger RemoveLeak.
Else - Actions
//Vậy tại sao không tắt ngay ở dòng If thứ 2 từ dưới đếm lên, mình sẽ trả lời là bởi vì mình không biết tại sao, chỉ tại khi vào test thì làm như vậy mới không có bug.[/COLOR]