superkhung
<font color=purple><b>MadDog</b></font>
Bái gốc mình post bên official forum, clone thêm 1 cái bên đây vì bên kia thảo luân đợi duyệt lâu vãi hà 
Trong bài trước viết về cách sử dụng macro căn bản bằng 2 lệnh /cast, /xcast. Bài này mình sẽ nói sơ về cách sử dụng /script macro, code sample trong hướng dẫn là một đoạn code single dps rotation rất căn bản cho class Tàng Kiếm.
Điểm hay và dở của script:
+ Hay: Có thể viết được các điều kiện logic phức tạp theo ý người chơi
+ Dở:
- Số lượng ký tự cho 1 script bị hạn chế chỉ có 1024 ký tự
- Người sử dụng phải biết lập trình Lua căn bản
- Người sử dụng phải biết đọc hiểu API của JX3 (API public có thể download tại đây, online version mới nhất ở đây
- Không có document hướng dẫn
Để khai báo 1 script macro, dùng lệnh /script ngay đầu macro để khai báo đây là 1 script
Một số variable mình sẽ sử dụng trong hướng dẫn này
+ nCurrentRage: số lượng kiếm khí đang có
+ nMaxRage: số lượng kiếm khí maximum
+ dwSchoolID: bảng nội công hiện tại
Các hàm sẽ sử dụng
+ GetSkillCDProgress(skillID, skillLevel): Lấy thông số cooldown của skill, giá trị trả về gồm có bOnCD (skill có cooldown time hày không, giá trị là true hoặc false), currentCDTime(thời gian cooldown còn lại của skill, giá trị trả về là second bằng hex), totalCDTime (tổng thời gian cooldown của skill)
+ OnAddOnUseSkill(skillID): cast 1 skill theo skillID
Kịch bản rotation căn bản cho Tàng Kiếm
+ Build kiếm khí lên full bằng các skill của nội công Vấn Thủy theo list skill mình sắp xếp
+ Chuyển nội công sang Sơn Cư khi kiếm khí đầy
+ Sử dụng các skill Sơn Cư theo list mình sắp xếp để dùng hết kiếm khí
+ Lặp lại các bước trên
Bắt đầu code
Lấy giá trị phần trăm lượng kiếm khí đang có
Tạo hàm check skill cooldown theo skillID, nếu skill hết thời gian cooldown sẽ trả về 0
Đầu tiên sẽ check xem lượng phần trăm kiếm khí đang có, nếu kiếm khí ít hơn 20% và đang ở bảng nội công Sơn Cư thì sẽ chuyển sang nội công Vấn Thủy bằng cách sử dụng skill Khiếu Nhật (skillID: 1656)
Code hoàn chỉnh (các bạn nào đang chơi Tàng Kiếm có thể tạo 1 cái chỉ lệnh và paste đoạn code này vào đánh thử, chỉ cần spam 1 button & relax :12:):
* Ở trên là toàn bộ các phần căn bản để code 1 cái script xử lý logic bằng ngôn ngữ Lua dùng script engine của JX3. Do phần scripting này liên quan khá nhiều đến lập trình Lua và đọc hiểu public API của game nên mình không thể detail vào từng dòng code như làm sao để sử dụng if/else, làm sao để khai báo hàm hoặc làm sao để biết các variable của player, npc ... Các phần này các bạn nào quan tâm và có khả năng nghiên cứu code thì có thể tìm đọc Lua reference manual và public API của Kingsoft trong link mình đã post ở đầu bài.
Mục đích bài viết là giới thiệu 1 phần chức năng hay có sẵn của game engine chưa được giới thiệu và sử dụng để cho một số bạn quan tâm có thể tìm hiểu thêm.
Ngoài ra tất cả các dạng macro của game không support cho PVP (không cast được skill lên player) mà chỉ sử dụng được cho PVE nên các bạn đừng thắc mắc vì sao không dùng được skill lên player khác. Cái này cũng hơi upset một chút tuy nhiên theo mình nghĩ Kingsoft cũng có lý do khi block macro cho PVP khi mà đối với 1 game cần personal skill cao để thể hiện trình độ trong PVP mà chỉ cần vài chục dòng code là có thể đánh đấm ì xèo theo logic định sẵn mà không dính sai lầm nào thì hơi quá bá đạo và mất đi cái hay của nó.

Trong bài trước viết về cách sử dụng macro căn bản bằng 2 lệnh /cast, /xcast. Bài này mình sẽ nói sơ về cách sử dụng /script macro, code sample trong hướng dẫn là một đoạn code single dps rotation rất căn bản cho class Tàng Kiếm.
Điểm hay và dở của script:
+ Hay: Có thể viết được các điều kiện logic phức tạp theo ý người chơi
+ Dở:
- Số lượng ký tự cho 1 script bị hạn chế chỉ có 1024 ký tự
- Người sử dụng phải biết lập trình Lua căn bản
- Người sử dụng phải biết đọc hiểu API của JX3 (API public có thể download tại đây, online version mới nhất ở đây
- Không có document hướng dẫn
Để khai báo 1 script macro, dùng lệnh /script ngay đầu macro để khai báo đây là 1 script
Bước đầu tiên để 1 script code chạy được, cần phải khai báo và lấy client object bằng hàm GetClientPlayer()/script CODE
Client object sẽ chứa rất nhiều variable của user hiện tại, ví dụ như lượng máu đang có, lượng máu maximum của player, lượng mân đang có, mana maximum, kiếm khí .../script local p=GetClientPlayer()
Hàm này sẽ lấy client object của user đưa vào biến local là p
Một số variable mình sẽ sử dụng trong hướng dẫn này
+ nCurrentRage: số lượng kiếm khí đang có
+ nMaxRage: số lượng kiếm khí maximum
+ dwSchoolID: bảng nội công hiện tại
Các hàm sẽ sử dụng
+ GetSkillCDProgress(skillID, skillLevel): Lấy thông số cooldown của skill, giá trị trả về gồm có bOnCD (skill có cooldown time hày không, giá trị là true hoặc false), currentCDTime(thời gian cooldown còn lại của skill, giá trị trả về là second bằng hex), totalCDTime (tổng thời gian cooldown của skill)
+ OnAddOnUseSkill(skillID): cast 1 skill theo skillID
Kịch bản rotation căn bản cho Tàng Kiếm
+ Build kiếm khí lên full bằng các skill của nội công Vấn Thủy theo list skill mình sắp xếp
+ Chuyển nội công sang Sơn Cư khi kiếm khí đầy
+ Sử dụng các skill Sơn Cư theo list mình sắp xếp để dùng hết kiếm khí
+ Lặp lại các bước trên
Bắt đầu code
Lấy giá trị phần trăm lượng kiếm khí đang có
Lấy thông số bảng nội công hiện tại đang sử dụng (SchoolID = 6: Vấn Thủy, SchoolID = 7: Sơn Cư)local ragePercent = p.nCurrentRage * 100 / p.nMaxRage
Tạo list skillID sẽ đánh theo thứ tự sắp xếplocal IsVT = p.dwSchoolID == 6
local IsSC = p.dwSchoolID == 7
* Để lấy skillID, có thể dùng Addon HM bằng cách giữ Control và move chuột đến skill mình muốn xem IDlocal VTSkills = {1578,1581,1646,1579} -- "Bình Hồ Đoạn Nguyệt","Hoàng Long Thổ Thúy","Thính Lôi","Cửu Khê Di Yên"
local SCSkills = {2759,1593,1600} -- "Ánh Ba Toả Lan","Vân Phi Ngọc Hoàng","Tịch Chiếu Lôi Phong"
Tạo hàm check skill cooldown theo skillID, nếu skill hết thời gian cooldown sẽ trả về 0
Tạo hàm cast skill theo thứ tự list skill mình khai báo ở trên, hàm này sẽ lấy vào skill list và kiểm tra nếu skill không có cooldown thì sẽ cast và return về đầu code, nếu skill đang cooldown thì sẽ xử lý tiếp skill tiếp theo trong list. Do hàm chỉ check skill đang có cooldown hay không mà không có check xem skill đã cast hay chưa nên nếu xếp các skill không có cooldown vào trước list sẽ bị tình trạng chỉ cast được skill đó mà không xử lý skill tiếp theo.local function CheckCDs(skillId)
bOnCD,currentCDTime,totalCDTime = p.GetSkillCDProgress(skillId,p.GetSkillLevel(skillId))
return currentCDTime/16 == 0 -- Giá trị thời gian trả về format là hex nên cần chia cho 16 để ra số second chính xác
end
Xử lý rotation logic.local function CastSkillIDs(skillIDs)
for z,x in pairs(skillIDs) do
if(CheckCDs(x)) then
OnAddOnUseSkill(x)
return true
end
end
end
Đầu tiên sẽ check xem lượng phần trăm kiếm khí đang có, nếu kiếm khí ít hơn 20% và đang ở bảng nội công Sơn Cư thì sẽ chuyển sang nội công Vấn Thủy bằng cách sử dụng skill Khiếu Nhật (skillID: 1656)
Tiếp theo nếu phần trăm kiếm khí đang có ít hơn 100% và đang dùng nội công Vấn Thủy thì sẽ sử dụng list skill của Vấn Thủy để build kiếm khí lên 100%if ragePercent < 20 and IsSC then OnAddOnUseSkill(1656) end
Khi phần trăm kiếm khí đã max và đang dùng nội công Vấn Thủy, chuyển sang nội công Sơn Cưif ragePercent < 100 and IsVT then CastSkillIDs(VTSkills) end
Sử dụng skill list của nội công Sơn Cư cho đến khi nào phần trăm kiếm khí ít hơn 20%if ragePercent == 100 and IsVT then OnAddOnUseSkill(1656) end
if ragePercent >= 20 and IsSC then CastSkillIDs(SCSkills) end
Code hoàn chỉnh (các bạn nào đang chơi Tàng Kiếm có thể tạo 1 cái chỉ lệnh và paste đoạn code này vào đánh thử, chỉ cần spam 1 button & relax :12:):
/script local p = GetClientPlayer()
local ragePercent = p.nCurrentRage * 100 / p.nMaxRage
local IsVT = p.dwSchoolID == 6
local IsSC = p.dwSchoolID == 7
local VTSkills = {1578,1581,1646,1579}
local SCSkills = {2759,1593,1600}
local function CheckCDs(skillId)
bOnCD,currentCDTime,totalCDTime = p.GetSkillCDProgress(skillId,p.GetSkillLevel(skillId))
return currentCDTime/16 == 0
end
local function CastSkillIDs(skillIDs)
for z,x in pairs(skillIDs) do
if(CheckCDs(x)) then
OnAddOnUseSkill(x)
return true
end
end
end
OnAddOnUseSkill(1651)
if ragePercent < 20 and IsSC then OnAddOnUseSkill(1656) end
if ragePercent < 100 and IsVT then CastSkillIDs(VTSkills) end
if ragePercent >= 95 and IsVT then OnAddOnUseSkill(1656) end
if ragePercent >= 20 and IsSC then CastSkillIDs(SCSkills) end
* Ở trên là toàn bộ các phần căn bản để code 1 cái script xử lý logic bằng ngôn ngữ Lua dùng script engine của JX3. Do phần scripting này liên quan khá nhiều đến lập trình Lua và đọc hiểu public API của game nên mình không thể detail vào từng dòng code như làm sao để sử dụng if/else, làm sao để khai báo hàm hoặc làm sao để biết các variable của player, npc ... Các phần này các bạn nào quan tâm và có khả năng nghiên cứu code thì có thể tìm đọc Lua reference manual và public API của Kingsoft trong link mình đã post ở đầu bài.
Mục đích bài viết là giới thiệu 1 phần chức năng hay có sẵn của game engine chưa được giới thiệu và sử dụng để cho một số bạn quan tâm có thể tìm hiểu thêm.
Ngoài ra tất cả các dạng macro của game không support cho PVP (không cast được skill lên player) mà chỉ sử dụng được cho PVE nên các bạn đừng thắc mắc vì sao không dùng được skill lên player khác. Cái này cũng hơi upset một chút tuy nhiên theo mình nghĩ Kingsoft cũng có lý do khi block macro cho PVP khi mà đối với 1 game cần personal skill cao để thể hiện trình độ trong PVP mà chỉ cần vài chục dòng code là có thể đánh đấm ì xèo theo logic định sẵn mà không dính sai lầm nào thì hơi quá bá đạo và mất đi cái hay của nó.
Chỉnh sửa cuối:


