Cách sử dụng script macro căn bản

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à :2cool_hell_boy:
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
/script CODE
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 local p=GetClientPlayer()
Hàm này sẽ lấy client object của user đưa vào biến local là p
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í ...

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ó
local ragePercent = p.nCurrentRage * 100 / p.nMaxRage
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 IsVT = p.dwSchoolID == 6
local IsSC = p.dwSchoolID == 7
Tạo list skillID sẽ đánh theo thứ tự sắp xếp
local 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"
* Để 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 ID
Tạo hàm check skill cooldown theo skillID, nếu skill hết thời gian cooldown sẽ trả về 0
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
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 CastSkillIDs(skillIDs)
for z,x in pairs(skillIDs) do
if(CheckCDs(x)) then
OnAddOnUseSkill(x)
return true
end
end
end
Xử lý rotation logic.
Đầ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)
if ragePercent < 20 and IsSC then OnAddOnUseSkill(1656) end
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 < 100 and IsVT then CastSkillIDs(VTSkills) 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 OnAddOnUseSkill(1656) 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 >= 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:
Bài này em đọc bên đó rồi, ko ngờ lại gặp bác ở đây, ko biết bác đã ra bài nâng cao chưa nữa :)
 
Bài này em đọc bên đó rồi, ko ngờ lại gặp bác ở đây, ko biết bác đã ra bài nâng cao chưa nữa :)

Để xem sắp tới rảnh rổi sẽ extend bài này thành cách code addon thay vì dùng scripting bị hạn chế 1024 chả :D
 
Bác rảnh làm luôn 1 cái macro cho MG đi :5cool_big_smile:

MG thì chỉ làm được spam basic thôi bởi vì 1 số variable của MG client version VN chưa có export, vd nCurrentSunEnergy, nMaxSunEnergy, nSunPowerValue, nCurrentMoonEnergy, nMaxMoonEnergy, nMoonPowerValue. Mấy cái var này cần để check Mãn Nhật, Mãn Nguyệt để làm các điều kiện ra combo.

Đây là 1 cái code spam skill đơn giản cho aoe & single của MG

/script p=GetClientPlayer()
function mg(szContent)
moon = {3963,3960,3964,3961,3959}
sun = {3963,3960,3964,3961,3962}
OnAddOnUseSkill(3979)
OnAddOnUseSkill(3967)
if szContent == "moon" then
CastSkillIDs(moon)
end
if szContent == "sun" then
CastSkillIDs(sun)
end
end
mg("moon")
Muốn đổi lại rotation của sun thì gọi lại hàm mg("sun") hoặc code riêng 2 cái cho 2 nút single & aoe
 
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à :2cool_hell_boy:
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
- 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()

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í ...

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ư)

Tạo list skillID sẽ đánh theo thứ tự sắp xếp

* Để 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 ID
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.

Xử lý rotation logic.
Đầ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%

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ư

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%


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ó.

đã test với mộc nhân :) goods phết bác.
nhưng mà dps vẫn thấp quá . đc có 5-6k :3
 
đã test với mộc nhân :) goods phết bác.
nhưng mà dps vẫn thấp quá . đc có 5-6k :3

Tui cũng chưa có con TK 80 nào nên chưa biết làm sao optimize dps cho nó, cái code này là base theo nhu cầu con TK 45 đang train thôi.
 
hôm nọ thứ cái đống này mà k đc :'(
/cast [target:boss,tnobuff:Mai Ẩn Hương,nobuff:夜雨-潮鸣弦] 梅隐香
/cast Ngọc Hồng Quán Nhật
/cast [nocd:Hoàng Long Thổ Thúy,tnoname:南之雷神-陆寻] Bình Hồ Đoạn Nguyệt
/cast [cdtime:Bình Hồ Đoạn Nguyệt>1.5,tnoname:南之雷神-陆寻] Hoàng Long Thổ Thúy
/cast [life<0.5] Tuyền Ngưng Nguyệt
/cast [life<0.6] Vân Tê Tùng
/cast [cdtime:Khiếu Nhật>3,mount:Vấn Thủy Quyết,rage>65] Oanh Minh Liễu
/cast [nocd:Tuyết Đoạn Kiều,nocd=:Oanh Minh Liễu,rage>80] Oanh Minh Liễu
/cast [mount:Vấn Thủy Quyết] Thính Lôi
/cast [cd:Hoàng Long Thổ Thúy] Cửu Khê Di Yên
/cast [rage<25,mount:Sơn Cư Kiếm Ý,nobuff:潮鸣弦] Tuyết Đoạn Kiều
/cast [nocd:Tuyết Đoạn Kiều,bufftime:Oanh Minh Liễu>25,rage<110] Tuyết Đoạn Kiều
/cast [rage<25,mount:Sơn Cư Kiếm Ý,cd:Tuyết Đoạn Kiều] trieu minh huyen
/cast [rage>80,mount:Vấn Thủy Quyết] Khiếu Nhật
/cast [mount:Sơn Cư Kiếm Ý] Mãnh Hổ Hạ Sơn
/cast [nobuff:厌高] 断潮
/cast [status:stand,nocd:Vân Phi Ngọc Hoàng] Vân Phi Ngọc Hoàng
/cast [buff:夜雨,nocd:Vân Phi Ngọc Hoàng] Vân Phi Ngọc Hoàng
/cast [status:run,nocd:Tịch Chiếu Lôi Phong] Tịch Chiếu Lôi Phong
/cast [status:jump,nocd:Tịch Chiếu Lôi Phong] Tịch Chiếu Lôi Phong
/cast [cdtime:Vân Phi Ngọc Hoàng>0.5,nocd:Tịch Chiếu Lôi Phong] Tịch Chiếu Lôi Phong
 
hôm nọ thứ cái đống này mà k đc :'(

Không xài được, cái đống macro multiline này là nó dùng 1 cái addon để extend macro function của jx3, thêm vào nhiều condition và support multiline macro. Mấy cái addon này chỉ dùng được trên jx3 cn, không dùng được cho jx3 vn vì hầu hết các addon bọn nó compile thành byte code để giấu source mà lua lib version đang run tại vn không match với version đang run ở cn nên sẽ bị fail compiled header lúc game engine load addon vào.
Có lẽ 1 thời gian nữa jx3 vn update các version sau thì sẽ xài được, hiện giờ thì không. Hiện giờ chỉ có các loại addon không compile (plain text code) mới xài được ở vn như HM, RaidGrid ...
 
Chủ topic cho hỏi cái "nCurrentRage" mình search sao ko có trong cái file Excel mà chủ topic đưa ra vậy. Tại đang tìm cái tương đương cho Đường Môn để viết cái script DM cho các bạn PVE cho nhàn mà ko biết nó là gì.

- - - Updated - - -

Và có cách nào để check được LUA version đang run bản VN là gì ko
 
Chủ topic cho hỏi cái "nCurrentRage" mình search sao ko có trong cái file Excel mà chủ topic đưa ra vậy. Tại đang tìm cái tương đương cho Đường Môn để viết cái script DM cho các bạn PVE cho nhàn mà ko biết nó là gì.

- - - Updated - - -

Và có cách nào để check được LUA version đang run bản VN là gì ko

0.7
:3cool_shame:
 
Chủ topic cho hỏi cái "nCurrentRage" mình search sao ko có trong cái file Excel mà chủ topic đưa ra vậy. Tại đang tìm cái tương đương cho Đường Môn để viết cái script DM cho các bạn PVE cho nhàn mà ko biết nó là gì.
Sorry file link API có vẻ hơi outdate, bạn có thể vào đây để xem version mới hơn (online version)
Các variables cho player, npc này nọ nằm ở cái tab thứ 3. Để mình update lại bài thêm link API.

Và có cách nào để check được LUA version đang run bản VN là gì ko
Dùng hexeditor load file lua5.dll vào rồi search $Lua: sẽ thấy lua version. Của vn là Lua 5.1.4
 
Bác cho hỏi con DM thì nó là Stamina hay gì vậy, bác cho em biết cái tên biến luôn được không?
 
Bác cho hỏi con DM thì nó là Stamina hay gì vậy, bác cho em biết cái tên biến luôn được không?

Không có char đường môn để check nên không rõ nó là cái gì, có lẽ là 3 cái này
nCurrentEnergy
nMaxEnergy
nEnergyReplenish

Thử vô game làm cái script này để check, nếu đúng là của DM thì nó sẽ in ra giá trị tương ứng số mình đang có, nếu không thì chắc của class khác.

/script p=GetClientPlayer()
Output(p.nCurrentEnergy)
Output(p.nMaxEnergy)
Output(p.nEnergyReplenish)
 
Bác superkhung cho hỏi có hàm nào để mô phỏng sự kiện button click không, tức là thay vì mình click vào button đó, mình gọi hàm là xong ấy?
 
công nhận pac này pro thật, thanks chia sẽ

- - - Updated - - -

sao e mò hoài làm cho đường môn mà ko dc nhỉ? có pac nào làm cho ĐM dc chưa, cho e xin tí kinh nghiệm:1cool_byebye:
 
Có bạn nào còn mày mò cái này không? Muốn viết script cho con Thiếu Lâm mà tìm mãi không biết điểm Thiền định là hàm gì? Bạn chủ topic hay bạn nào biết chia sẻ giúp. Thanks!
 
Bác Superkhung tư vấn chỗ này cái. Đang edit lại cái add on tự động ghép đá ngũ hành. Nó có code lọc tên vật phẩm, chứ ko lọc ID.
Tên TQ: 五行石·火(六级)
Tên VN: Đá Ngũ Hành-Hỏa (Lv6)

Đang bí vì cái dấu ()của nó là ký tự TQ, toàn bộ tên ko có khoảng trắng, còn bản VN đổi lại thành (). Dùng NotePad+ edit thì nó lại nhận dấu () lại là câu lệnh, chứ ko chịu ghép vào tên vật phẩm. Bác có cách nào thỉ chỉ dùm với
Nguyên văn đoạn code đang bị bí
local szLoopTypeName, szLoopLevelName = itemLoop.szName:match("Đá Ngũ Hành-(.+) (Lv(.+))")
 
Mình tìm được rồi, không ngờ giá trị cao nhất của điểm thiền định lại là 10. Làm tìm mãi.
 
Back
Top