:):):):):)
Em post đây là để hướng dẫn cho các newbie dùng GUI,Nếu cách này có ai post rồi thì thứ lỗi nhé :X
Mui for Gui by Custom Value..:) :
-Như ta đã biết thì MUI(Multi....
) chính là khả năng mà nhiều unit có thể cast skill = trigger mà không bị bug.Và rất hiếm khi mà Gui có khả năng này.Chính xác là khó làm chứ không phải không thể..:).Sở dĩ GUI thường mắc nhưng lỗi như vậy vì các biến của GUI khi gán vào một giá..Nếu sử dụng liên tiếp thì các giá trị cũ đè lên nhau khiến hay mất dữ liệu trước.Vì vậy mà cần có cách lưu lại giá trị của biến trong Gui khi sử dụng 1 dữ liệu cùng tên liên tục.Vâng,chắc chắn các bạn cũng nghĩ đến kiểu mảng.Đó là kiểu có thể lưu nhiều dữ liệu với đánh số thứ tự cho biến(đoạn này hơi khó hiểu 1 tý :P)Thường thì trước đây các mem dùng 1 biến Integer để để điều chỉnh số thứ tự đó để cho chúng không trùng nhau..Nhưng vẫn không thể giải quyết vấn đề MUI vì nếu cast liên tiếp thì biến Integer vẫn bị đè nhâu dẫn đến sai lệch tọa ra bug.Vì vậy mà ta cần một giá trị khác không bị biến đổi trong quá trình Spell diễn raCustom Value(of unit)Sau đây e có 1 skill như sau(Link down map: http://www.mediafire.com/file/nzntztiznl2/gf.w3x,đây là skill bắn ra một tia đao khí gây sát thuong cho mục tiêu đi qua,càng về xa cây đao càng to(Cho đẹp thôi chứ không quan trọng :P)).Skill tên là Kiếm khí lên các biến sẽ gắn đuôi KK
:
-Biến sử dụng:
+MUI[integer]: để cố định custom value
+CasterKK[Unit]:Để ghi lại caster là ai(Thực chất chỉ để xét dame = hệ số x lvl nhưng vì ở trigger2 lên bắt buộc phải có :( , tốn cả kb
)
+CasterKK2[Unit]
ể không bị Leak ấy mà :)
+TargetPoint[Point]
ể không bị Leak ấy mà :)
+DamagedGroupKK[unit group]:để kiểm soát nhừng mục tiêu đã bị đánh thì sẽ không đánh nữa
+DamagingGroupKK[unit group]:để kiểm soát những mục tiêu phải take dame
+DemKK[interger]:Để kiểm soát tiến độ di chuyển của unit
+DemKKMax[interger]:Để kiểm soát không cho Dummy vượt quá độ xa target
+MovePointKK[Point]:Để ghi lại vị trí và để di chuyển Dummy trong trigger 2
(các biến trên đều là Array(kiểu mảng)) :)
Ok let's start :)
Trigger 1(Kiemkhi<-tên trong map)
Trigger2(KiêmMove)
Trước hết nói về trigger 1:
+Event:1 unit bắt đầu hiệu ứng của 1 skill
+Condition:Kĩ năng đó là Kiếm khí
+Action
-Turn on Trigger 2:Bạn hãy xem một chút,trigger 2 hoạt động với Group MoveGroupKK(tý nữa tôi sẽ giải thích nó hoạt động thế nào :P) và turn off nếu MoveGroupKK không có unit nào
-Lệnh If MUI =100(..): để reset giá trị của MUI.Bạn đừng lo,chắc chắn sẽ không có bug ở giai đoạn bị đè này vì giả sử MUI = 100 -> MUI đc đặt = 0.Mà giá trị lần cast gần nhất sẽ là MUI=99 -> không thể đè lên nhau,trừ phi tốc độ nháy skill của bạn nhanh hơn tốc độ xử lí vài triêu phép tính trong 1s của PC
:)
-Set MUI= Mui +1 :Để giá trị của MUI luôn tiếp diễn,không đè lên nhau
-Creat 1 Kiêm(..):Tạo 1 Dummy tại vị trí của caster
-Unit Group-Add(..):Cho Dummy vừa tạo ra vào MoveGroupKK
-Turn(..):khỏi cần nói nhé :)
-Set the custom value of(..):Vâng và đây chính là cách để custom value không bị thất thoát mà sẽ luôn = Mui.Và nếu bạn muốn cách này có bug thi cố gắng làm như ở MUI ấy

-Animation(..):Cái náy không quan trọng ai hiểu thì hiểu,chủ yếu là để làm đẹp thôi
-Set Caster,Dem,DemKK (..): Đặt các biến trên dưới số thứ tự là Custom Value.Nếu ai không hiểu công dung thì tham khảo spell của a Tom nhé(Skill Wave của Morphin ấy :X)
-Custom(..):để tạo một Group,đó là Damaged Group để kiểm soát...(bên trên).
Vâng,đó là giai đoạn chuẩn bị để ta bước vào Trigger 2(trigger này không để Intially):
+Event: Every Time (..):để diễn ra liên tục các Action
+Action
-Unit Group(..):và đây chính là yếu tố làm cho Gui có thể MUI 1 cách thoải mái,tất cả các lếnh sau này đều nằm trong acction này
-Sau đó là một tràng giang đại hải các bạn phải tự hiểu nhé :)...Vì nó rất giống với các skill khác mà
-If(..)(cái này không nằm trong Unit Group):Để khi mà trong MoveGroupKK không có unit thì trigger này không hoạt động nữa -> giảm lượng thông tin phải xử lí.Nếu như phải để Intially On như cách cũ thì mỗi vài phần giây trigger lại hoạt động nên game khá nặng..
tôi nghĩ chắc các bạn không hiểu gì ở Trigger 2 sao lai phải đặt trong Unit Group,Thật là rườm rà.Và tại sao lại phải là Custom value của picked unit trong cặp Unit Group?..Bạn có thể hiểu đơn giản thế này:
Mỗi 0.04 giây thi WE sẽ pick các unit trong Unit Group(1 unit thì làm 1 lần) và làm các việc sau đó.Vì vậy mà ta dã gán cho các biến Array giả trị là Custom Value của của các Dummy,mà các Dummy này đã đc lưu cố định trong Unit Group-> các custom value luôn cố định dù cho thơi gian và số lường MUI có tăng lên->Các giá trị của biến cũng đc set 1 cách cố định -> các giả trị của biến cũng cố đinh không bị đè nên nhau dù cho trigger đc dùng nhiều lần,Vì thế không xuất hiên hiện tượng Bug trong khi nhiều unit sử dụng skill này
Thế là e The End ở đây.Ai thấy bài viết hữu ích thì thank e 1 cái :X
Đoạn giải thích e viết hơi khó hiểu,các Pro ai hiểu rồi có thể viết lại một cách dễ hiêu hơn cho các New Bie hộ e nhế :P
Thank all,Nhớ Thank e nhé :P



----------------------------------------------
Thank a Tom nhé e fig lại Leak rồi đấy...
P/S : Tại sao không lạ là Jass khi GUI cũng có thể ?
---------------------------------------------
Cách này đc tham khảo rất nhiều từ .... E cũng không biết tên nữa nhưng mà e học trong Map Boomerang ở trong topic post GUI Spell ấy ..Thank a nhá
Em post đây là để hướng dẫn cho các newbie dùng GUI,Nếu cách này có ai post rồi thì thứ lỗi nhé :X
Mui for Gui by Custom Value..:) :
-Như ta đã biết thì MUI(Multi....
) chính là khả năng mà nhiều unit có thể cast skill = trigger mà không bị bug.Và rất hiếm khi mà Gui có khả năng này.Chính xác là khó làm chứ không phải không thể..:).Sở dĩ GUI thường mắc nhưng lỗi như vậy vì các biến của GUI khi gán vào một giá..Nếu sử dụng liên tiếp thì các giá trị cũ đè lên nhau khiến hay mất dữ liệu trước.Vì vậy mà cần có cách lưu lại giá trị của biến trong Gui khi sử dụng 1 dữ liệu cùng tên liên tục.Vâng,chắc chắn các bạn cũng nghĩ đến kiểu mảng.Đó là kiểu có thể lưu nhiều dữ liệu với đánh số thứ tự cho biến(đoạn này hơi khó hiểu 1 tý :P)Thường thì trước đây các mem dùng 1 biến Integer để để điều chỉnh số thứ tự đó để cho chúng không trùng nhau..Nhưng vẫn không thể giải quyết vấn đề MUI vì nếu cast liên tiếp thì biến Integer vẫn bị đè nhâu dẫn đến sai lệch tọa ra bug.Vì vậy mà ta cần một giá trị khác không bị biến đổi trong quá trình Spell diễn raCustom Value(of unit)Sau đây e có 1 skill như sau(Link down map: http://www.mediafire.com/file/nzntztiznl2/gf.w3x,đây là skill bắn ra một tia đao khí gây sát thuong cho mục tiêu đi qua,càng về xa cây đao càng to(Cho đẹp thôi chứ không quan trọng :P)).Skill tên là Kiếm khí lên các biến sẽ gắn đuôi KK
:-Biến sử dụng:
+MUI[integer]: để cố định custom value
+CasterKK[Unit]:Để ghi lại caster là ai(Thực chất chỉ để xét dame = hệ số x lvl nhưng vì ở trigger2 lên bắt buộc phải có :( , tốn cả kb
)+CasterKK2[Unit]
ể không bị Leak ấy mà :)+TargetPoint[Point]
ể không bị Leak ấy mà :)+DamagedGroupKK[unit group]:để kiểm soát nhừng mục tiêu đã bị đánh thì sẽ không đánh nữa
+DamagingGroupKK[unit group]:để kiểm soát những mục tiêu phải take dame
+DemKK[interger]:Để kiểm soát tiến độ di chuyển của unit
+DemKKMax[interger]:Để kiểm soát không cho Dummy vượt quá độ xa target
+MovePointKK[Point]:Để ghi lại vị trí và để di chuyển Dummy trong trigger 2
(các biến trên đều là Array(kiểu mảng)) :)
Ok let's start :)
Trigger 1(Kiemkhi<-tên trong map)
Mã:
Events
Unit - A unit Starts the effect of an ability
Conditions
(Ability being cast) Equal to Kiêm khÃ
Actions
Trigger - Turn on KiemMove <gen>
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
MUI Greater than or equal to 100
Then - Actions
Set MUI = 0
Else - Actions
Set MUI = (MUI + 1)
Set CasterKK2[MUI] = (Casting unit)
Set TargetPointKK[MUI] = (Target point of ability being cast)
Set CasterPointKK[MUI] = (Position of Caster[MUI])
Unit - Create 1 Kiêm for (Owner of CasterKK2[MUI]) at (Position of CasterKK2[MUI]) facing (Angle from (Position of CasterKK2[MUI]) to TargetPointKK[MUI]) degrees
Unit Group - Add (Last created unit) to MoveGroupKK
Unit - Turn collision for (Last created unit) Off
Unit - Set the custom value of (Last created unit) to MUI
Animation - Change (Last created unit)'s size to (100.00%, 100.00%, 100.00%) of its original size
Set CasterKK[(Custom value of (Last created unit))] = (Casting unit)
Set DemKK[(Custom value of (Last created unit))] = 0
Set DemKKMax[(Custom value of (Last created unit))] = ((Integer((Distance between (Position of CasterKK2[MUI]) and TargetPointKK[MUI]))) / 30)
Set AngelKK[(Custom value of (Last created unit))] = (Angle from CasterPointKK[MUI] to TargetPointKK[MUI])
Custom script: call RemoveLocation(udg_TargetPointKK[udg_MUI])
Custom script: call RemoveLocation(udg_CasterPointKK[udg_MUI])
Custom script: set udg_DamagedGroupKK[GetUnitUserData(GetLastCreatedUnit())]=CreateGroup()
Mã:
Events
Time - Every 0.04 seconds of game time
Actions
Unit Group - Pick every unit in MoveGroupKK and do (Actions)
Loop - Actions
Animation - Change (Picked unit)'s size to ((100.00 + (8.00 x (Real(DemKK[(Custom value of (Picked unit))]))))%, (100.00 + (8.00 x (Real(DemKK[(Custom value of (Picked unit))]))))%, (100.00 + (8.00 x (Real(DemKK[(Custom value of (Picked unit))]))))%) of its original size
Set MovePointKK[(Custom value of (Picked unit))] = (Position of (Picked unit))
Set MovePointKK2[(Custom value of (Picked unit))] = (MovePointKK[(Custom value of (Picked unit))] offset by 30.00 towards AngelKK[(Custom value of (Picked unit))] degrees)
Unit - Move (Picked unit) instantly to MovePointKK2[(Custom value of (Picked unit))]
Set DamagingGroupKK = (Units within 100.00 of MovePointKK2[(Custom value of (Picked unit))] matching ((((Matching unit) is A structure) Equal to False) and ((((Matching unit) is alive) Equal to True) and ((((Matching unit) belongs to an enemy of (Owner of (Picked unit))) Equal to T
Custom script: call RemoveLocation(udg_MovePointKK[GetUnitUserData(GetEnumUnit())])
Custom script: call RemoveLocation(udg_MovePointKK2[GetUnitUserData(GetEnumUnit())])
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Number of units in DamagingGroupKK) Not equal to 0
Then - Actions
Unit Group - Add (Random unit from DamagingGroupKK) to DamagedGroupKB
Unit - Cause (Picked unit) to damage (Random unit from DamagingGroupKK), dealing (50.00 x (Real((Level of Kiêm khà for CasterKK[(Custom value of (Picked unit))])))) damage of attack type Chaos and damage type Lightning
Special Effect - Create a special effect attached to the chest of (Random unit from DamagingGroupKK) using Abilities\Spells\Other\Stampede\StampedeMissileDeath.mdl
Special Effect - Destroy (Last created special effect)
Else - Actions
Custom script: call DestroyGroup(udg_DamagingGroupKK)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
DemKK[(Custom value of (Picked unit))] Greater than or equal to DemKKMax[(Custom value of (Picked unit))]
Then - Actions
Set CasterKK[(Custom value of (Picked unit))] = No unit
Unit - Kill (Picked unit)
Unit Group - Remove (Picked unit) from MoveGroupKK
Custom script: call DestroyGroup(udg_DamagedGroupKK[GetUnitUserData(GetEnumUnit())])
Else - Actions
Set DemKK[(Custom value of (Picked unit))] = (DemKK[(Custom value of (Picked unit))] + 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Number of units in MoveGroupKK) Equal to 0
Then - Actions
Trigger - Turn off (This trigger)
Else - Actions
Trước hết nói về trigger 1:
+Event:1 unit bắt đầu hiệu ứng của 1 skill
+Condition:Kĩ năng đó là Kiếm khí
+Action
-Turn on Trigger 2:Bạn hãy xem một chút,trigger 2 hoạt động với Group MoveGroupKK(tý nữa tôi sẽ giải thích nó hoạt động thế nào :P) và turn off nếu MoveGroupKK không có unit nào
-Lệnh If MUI =100(..): để reset giá trị của MUI.Bạn đừng lo,chắc chắn sẽ không có bug ở giai đoạn bị đè này vì giả sử MUI = 100 -> MUI đc đặt = 0.Mà giá trị lần cast gần nhất sẽ là MUI=99 -> không thể đè lên nhau,trừ phi tốc độ nháy skill của bạn nhanh hơn tốc độ xử lí vài triêu phép tính trong 1s của PC
:)-Set MUI= Mui +1 :Để giá trị của MUI luôn tiếp diễn,không đè lên nhau
-Creat 1 Kiêm(..):Tạo 1 Dummy tại vị trí của caster
-Unit Group-Add(..):Cho Dummy vừa tạo ra vào MoveGroupKK
-Turn(..):khỏi cần nói nhé :)
-Set the custom value of(..):Vâng và đây chính là cách để custom value không bị thất thoát mà sẽ luôn = Mui.Và nếu bạn muốn cách này có bug thi cố gắng làm như ở MUI ấy

-Animation(..):Cái náy không quan trọng ai hiểu thì hiểu,chủ yếu là để làm đẹp thôi
-Set Caster,Dem,DemKK (..): Đặt các biến trên dưới số thứ tự là Custom Value.Nếu ai không hiểu công dung thì tham khảo spell của a Tom nhé(Skill Wave của Morphin ấy :X)
-Custom(..):để tạo một Group,đó là Damaged Group để kiểm soát...(bên trên).
Vâng,đó là giai đoạn chuẩn bị để ta bước vào Trigger 2(trigger này không để Intially):
+Event: Every Time (..):để diễn ra liên tục các Action
+Action
-Unit Group(..):và đây chính là yếu tố làm cho Gui có thể MUI 1 cách thoải mái,tất cả các lếnh sau này đều nằm trong acction này
-Sau đó là một tràng giang đại hải các bạn phải tự hiểu nhé :)...Vì nó rất giống với các skill khác mà
-If(..)(cái này không nằm trong Unit Group):Để khi mà trong MoveGroupKK không có unit thì trigger này không hoạt động nữa -> giảm lượng thông tin phải xử lí.Nếu như phải để Intially On như cách cũ thì mỗi vài phần giây trigger lại hoạt động nên game khá nặng..
tôi nghĩ chắc các bạn không hiểu gì ở Trigger 2 sao lai phải đặt trong Unit Group,Thật là rườm rà.Và tại sao lại phải là Custom value của picked unit trong cặp Unit Group?..Bạn có thể hiểu đơn giản thế này:
Mỗi 0.04 giây thi WE sẽ pick các unit trong Unit Group(1 unit thì làm 1 lần) và làm các việc sau đó.Vì vậy mà ta dã gán cho các biến Array giả trị là Custom Value của của các Dummy,mà các Dummy này đã đc lưu cố định trong Unit Group-> các custom value luôn cố định dù cho thơi gian và số lường MUI có tăng lên->Các giá trị của biến cũng đc set 1 cách cố định -> các giả trị của biến cũng cố đinh không bị đè nên nhau dù cho trigger đc dùng nhiều lần,Vì thế không xuất hiên hiện tượng Bug trong khi nhiều unit sử dụng skill này
Thế là e The End ở đây.Ai thấy bài viết hữu ích thì thank e 1 cái :X
Đoạn giải thích e viết hơi khó hiểu,các Pro ai hiểu rồi có thể viết lại một cách dễ hiêu hơn cho các New Bie hộ e nhế :P
Thank all,Nhớ Thank e nhé :P




----------------------------------------------
Thank a Tom nhé e fig lại Leak rồi đấy...
P/S : Tại sao không lạ là Jass khi GUI cũng có thể ?
---------------------------------------------
Cách này đc tham khảo rất nhiều từ .... E cũng không biết tên nữa nhưng mà e học trong Map Boomerang ở trong topic post GUI Spell ấy ..Thank a nhá

...E thử rồi mà nhỉ.Nếu leak 500 point 1 s mà sao eắn tệt bô có thấy lag đâu 
..Để e chỉnh lại cái 
.
, thế thì dễ lẫn lộn thật ( hèn gì map mình leak thật >"< )
a nhầm hàng à e sửa lại rồi có bị leak đâu.A nhầm rồi đấy.Để KK mới đúng.Tức là cái trước sẽ đè cái sau -> dữ liệu cái trước thay vào đó là cái sau.Sau đó đã remove cái sau rồi 