Quản lý chỉ lệnh-Hướng dẫn và chia sẻ

Cái vụ check trấn phái tàng kiếm thì mình góp ý rất đơn giản để giải quyết này: dùng GetSkillLevel của 2 cái Đạp Tuyết Tầm Mai và Ánh Ba Tỏa Lan (hoặc triều minh huyền gì đó, ulti của sơn cư), nếu cái nào có skill level == 1 thì chắc chắn là đang dùng trấn phái bên đó, còn nếu ko nâng thì skill level sẽ là 0, đơn giản hiệu quả. Có thể check đc cả những cái khác trong trấn phái xem có nâng hay ko, lấy skill ID y như skill đánh bình thường mà thôi, chủ yếu là GetSkillLevel xem có nâng hay ko là đc. Kat có thể share đoạn catch event để lấy giá trị threat của player đối với target hiện tại ko? Mình tìm trong đống addon TQ mà nhiều quá vẫn chưa lọc ra đc :D À mà cả event DO_SKILL_CAST các arg của nó mình vẫn chưa nắm hết nữa, cái skill result code có ai biết nằm ở arg bao nhiêu và cái bCriticalStrike gì đó để biết có bạo kích hay ko nằm ở arg bao nhiêu ko?, hình như còn có cả arg SKILL_EFFECT gì đó nữa :D

À tiện thể, share luôn 1 hàm để đọc bí kíp của skill:

Mã:
function CheckSkillRecipe(skillID,recipeID)
	p=GetClientPlayer()
	local result=false
	recipeList=p.GetSkillRecipeList(skillID,p.GetSkillLevel(skillID))
	for z,x in pairs(recipeList or {}) do
		if x.recipe_id==recipeID and x.active==true then
			result=true
		end
	end
	return result
end

Muốn biết skill recipe ID của bí kíp mình muốn check là gì thì cứ:
Mã:
Output(p.GetSkillRecipeList(skillID,p.GetSkillLevel(skillID)))
Xem cái nào chuyển từ active=true sang false là đc.

- - - Updated - - -

Hàm ở trên khá hữu dụng khi xét 1 số buff của skill đánh ra mà phải có bí kíp mới có (vd phệ tâm, khí phách (+5% nguyên khí) của DM, phệ cốt của VH, check bí kíp +20% ntốc độ nhận NL NH của cực lạc dẫn, v..v..)

Giải pháp của bạn cho Tàng kiếm là hay đấy vì nó dựa vào phong cách chơi phổ biến của phái đấy :4cool_baffle: nhưng áp dụng cho ông Vạn hoa biến thái thì lại toi ngay, nhưng VH thì kiểu gì cũng là kinh mạch Hoa gian rồi nên ko phải nghĩ :6cool_boss:
Còn để lấy threat thì có hàm cập nhật threat là ApplyCharacterThreatRankList(dwCharacterID). Ví dụ mình muốn cập nhật cừu hận với boss đang là target chẳng hạn thì dùng là ApplyCharacterThreatRankList(target.dwID). Tất nhiên là mình ko cần chạy cái hàm này thì game vẫn đều đặn cận nhật cừu hận thôi nhưng lúc cần lấy chạy hàm này thì nó cập nhật cừu hận ngay. Sau khi hàm này được thực thi thì nó sẽ sinh ra một event là "CHARACTER_THREAT_RANKLIST", event này trả ra nhiều arg nhưng mình quan tâm tới 2 cái là arg0 chính là ID của nhân vật đang cập nhật cừu hận và arg1 chưa giá trị cừu hận của tất cả các player đối với nhân vật đó. Có thể truy suất giá trị cừu hận của mình bằng ID của mình thông qua hàm GetClientPlayer().dwID hoặc hàm UI_GetClientPlayerID() kiểu arg1[UI_GetClientPlayerID()], Rank cừu hận mà chúng ta nhìn thấy trong bảng thống kê cừu hận là so sánh giữa cừu hận của mình và cừu hận của target. Lấy cừu hận của target bằng arg1[arg2].
Nói lằng nhằng nhưng nếu viết thành hàm nó sẽ thế này.
Mã:
local dwMyHatred=0
local dwTargetRank=0
RegisterEvent("CHARACTER_THREAT_RANKLIST", function()
	if arg0 == target.dwID then
		if arg2 and arg1[arg2] then
			dwTargetRank = arg1[arg2]
			if dwTargetRank == 0 then
				dwTargetRank = 65535
			end
			nHatred = arg1[UI_GetClientPlayerID()] or 0
			dwMyHatred = (nHatred / dwTargetRank) * 100
		end
	end
end)
-------------------------------------
function GetMyHatred(target)
ApplyCharacterThreatRankList(target.dwID)
return dwMyHatred
end
 
GetBuffList
Một vài bài trước mình đã nói về hàm GetBuffList trả ra một bảng và trong đó có một số trường và mọi người đã làm quen với các trường này là dwID, nEndFrame và nStackNum, hôm nay mình giới thiệu nốt 2 trường còn lại là:
dwID: BuffID
nLevel: Buff Level
bCanCancel: có thể hủy bằng cách chuột phải vào buff hoặc dùng hàm CancelBuff
nEndFrame: Buff End Time
nIndex: buff index
nStackNum: số tầng của buff
dwSkillSrcID: ID của đối tượng tạo ra buff này
Với chừng này thông tin thì chúng ta có thể dùng để giải quyết thêm một số việc nữa.
Ví dụ: hủy buff tự động (mình đã từng thấy có bạn MG hỏi làm sao hủy Tham ma thể bằng chỉ lệnh thì phải :D), kiểm tra xem buff hay debuff có phải do mình đánh ko để đánh tiếp.
Mình sẽ nâng cấp hàm CheckBuff bằng cách thêm vào một tham số nữa để quy định xem có check buff do chính mình đánh ra hay ko?
Mã:
function CheckBuff(target,dwBuffID, bSrc)
me=GetClientPlayer()
tBuffList=target.GetBuffList()
for z,x in pairs(tBuffList) do
	if x.dwID==dwBuffID then
		if bSrc then
			if x.dwSkillSrcID=me.dwID then
				return true
			else
				return false
			end
		else
			return true
		end
	end
end
	return false
end
Chẳng hạn khi chúng ta muốn check trên người ta hay trên người buff có một buff nào ko mà ko quan tâm tới buff đó từ đâu ra thì để bSrc là false, còn nếu muốn check xem buff đấy có phải là của chúng ta gây ra hay ko thì để nó là true.
Ví dụ: Thuần dương khi cắm kiếm Phá Thương Khung sẽ nhận được buff Phá Thương Khung, tuy nhiên buff này có dwSkillSrcID là của thanh kiếm chứ ko phải là của người, vì vậy nếu để bSrc là true thì cứ hết cooldown Phá thương khung là nó lại cắm kiếm.
 
Chỉnh sửa cuối:
GetBuffList
Một vài bài trước mình đã nói về hàm GetBuffList trả ra một bảng và trong đó có một số trường và mọi người đã làm quen với các trường này là dwID, nEndFrame và nStackNum, hôm nay mình giới thiệu nốt 2 trường còn lại là:
dwID: BuffID
nLevel: Buff Level
bCanCancel: có thể hủy bằng cách chuột phải vào buff hoặc dùng hàm CancelBuff
nEndFrame: Buff End Time
nIndex: buff index
nStackNum: số tầng của buff
dwSkillSrcID: ID của đối tượng tạo ra buff này
Với chừng này thông tin thì chúng ta có thể dùng để giải quyết thêm một số việc nữa.
Ví dụ: hủy buff tự động (mình đã từng thấy có bạn MG hỏi làm sao hủy Tham ma thể bằng chỉ lệnh thì phải :D), kiểm tra xem buff hay debuff có phải do mình đánh ko để đánh tiếp.
Mình sẽ nâng cấp hàm CheckBuff bằng cách thêm vào một tham số nữa để quy định xem có check buff do chính mình đánh ra hay ko?
Mã:
function CheckBuff(target,dwBuffID, bSrc)
me=GetClientPlayer()
tBuffList=target.GetBuffList()
for z,x in pairs(tBuffList) do
	if x.dwID==dwBuffID then
		if bSrc then
			if x.dwSkillSrcID=me.dwID then
				return true
			else
				return false
			end
		else
			return true
		end
	end
end
	return false
end
Chẳng hạn khi chúng ta muốn check trên người ta hay trên người buff có một buff nào ko mà ko quan tâm tới buff đó từ đâu ra thì để bSrc là false, còn nếu muốn check xem buff đấy có phải là của chúng ta gây ra hay ko thì để nó là true.
Ví dụ: Thuần dương khi cắm kiếm Phá Thương Khung sẽ nhận được buff Phá Thương Khung, tuy nhiên buff này có dwSkillSrcID là của thanh kiếm chứ ko phải là của người, vì vậy nếu để bSrc là true thì cứ hết cooldown Phá thương khung là nó lại cắm kiếm.


Sao hàm ko chạy vậy bác, mình đánh thế này có đúng ko???
if not CheckBuff(me,3881,true) then use(3702) end
 
Sao hàm ko chạy vậy bác, mình đánh thế này có đúng ko???
if not CheckBuff(me,3881,true) then use(3702) end

vấn đề là check cái buff 3881 đấy trên đối tượng nào? Nếu check trên người mình thì đúng, còn check trên người đối phương thì là sai :3cool_embarrassed:
 
vấn đề là check cái buff 3881 đấy trên đối tượng nào? Nếu check trên người mình thì đúng, còn check trên người đối phương thì là sai :3cool_embarrassed:
Mình check chiêu Huyền Thuỷ Cổ của bản thân mà, no ko chạy bạn ơi :9cool_pudency:
 
Mình check chiêu Huyền Thuỷ Cổ của bản thân mà, no ko chạy bạn ơi :9cool_pudency:

Ban căng nhỉ, để mai mượn con Ngũ Độc check xem sao :6cool_boss: toàn ngồi viết nhưng ko test :4cool_baffle:
 
Giải pháp của bạn cho Tàng kiếm là hay đấy vì nó dựa vào phong cách chơi phổ biến của phái đấy :4cool_baffle: nhưng áp dụng cho ông Vạn hoa biến thái thì lại toi ngay, nhưng VH thì kiểu gì cũng là kinh mạch Hoa gian rồi nên ko phải nghĩ :6cool_boss:
Còn để lấy threat thì có hàm cập nhật threat là ApplyCharacterThreatRankList(dwCharacterID). Ví dụ mình muốn cập nhật cừu hận với boss đang là target chẳng hạn thì dùng là ApplyCharacterThreatRankList(target.dwID). Tất nhiên là mình ko cần chạy cái hàm này thì game vẫn đều đặn cận nhật cừu hận thôi nhưng lúc cần lấy chạy hàm này thì nó cập nhật cừu hận ngay. Sau khi hàm này được thực thi thì nó sẽ sinh ra một event là "CHARACTER_THREAT_RANKLIST", event này trả ra nhiều arg nhưng mình quan tâm tới 2 cái là arg0 chính là ID của nhân vật đang cập nhật cừu hận và arg1 chưa giá trị cừu hận của tất cả các player đối với nhân vật đó. Có thể truy suất giá trị cừu hận của mình bằng ID của mình thông qua hàm GetClientPlayer().dwID hoặc hàm UI_GetClientPlayerID() kiểu arg1[UI_GetClientPlayerID()], Rank cừu hận mà chúng ta nhìn thấy trong bảng thống kê cừu hận là so sánh giữa cừu hận của mình và cừu hận của target. Lấy cừu hận của target bằng arg1[arg2].
Nói lằng nhằng nhưng nếu viết thành hàm nó sẽ thế này.
Mã:
local dwMyHatred=0
local dwTargetRank=0
RegisterEvent("CHARACTER_THREAT_RANKLIST", function()
	if arg0 == target.dwID then
		if arg2 and arg1[arg2] then
			dwTargetRank = arg1[arg2]
			if dwTargetRank == 0 then
				dwTargetRank = 65535
			end
			nHatred = arg1[UI_GetClientPlayerID()] or 0
			dwMyHatred = (nHatred / dwTargetRank) * 100
		end
	end
end)
-------------------------------------
function GetMyHatred(target)
ApplyCharacterThreatRankList(target.dwID)
return dwMyHatred
end

Cái trò check skill TK thì chắc chắn là đúng vì đã nâng đến đạp tuyết tầm mai tức là phải nâng gần 20 điểm vào bảng vấn thủy rồi, ko thể nào nâng đạp tuyết khi theo sơn cư đc =)) Còn bố nào ko thèm nâng đạp tuyết khi đánh vấn thủy thì.. miễn bàn, mình bó tay :)) Tương tự cho bên sơn cư. Thanks về cái tên event nhé, mình register đc rồi :D
 
Mã:
if x.dwSkillSrcID=me.dwID then

thay 2 dấu == vào là ok thôi.
 
Nói lằng nhằng nhưng nếu viết thành hàm nó sẽ thế này.
Mã:
local dwMyHatred=0
local dwTargetRank=0
RegisterEvent("CHARACTER_THREAT_RANKLIST", function()
	if arg0 == target.dwID then
		if arg2 and arg1[arg2] then
			dwTargetRank = arg1[arg2]
			if dwTargetRank == 0 then
				dwTargetRank = 65535
			end
			nHatred = arg1[UI_GetClientPlayerID()] or 0
			dwMyHatred = (nHatred / dwTargetRank) * 100
		end
	end
end)
-------------------------------------
function GetMyHatred(target)
ApplyCharacterThreatRankList(target.dwID)
return dwMyHatred
end

Cái hàm GetMyHatred sử dụng ntn vậy bạn, giá trị trả về của nó là % phải ko nhĩ :7cool_waaaht:
vậy để check cừu hận của mình vs target để buff Bằng Hư Ngự Phong thì sao nhĩ
if GetMyHatred(T)>80 then Use(355) end phải ko nhĩ :1cool_dribble:
 
Cái hàm GetMyHatred sử dụng ntn vậy bạn, giá trị trả về của nó là % phải ko nhĩ :7cool_waaaht:
vậy để check cừu hận của mình vs target để buff Bằng Hư Ngự Phong thì sao nhĩ
if GetMyHatred(T)>80 then Use(355) end phải ko nhĩ :1cool_dribble:

Thì đúng là để làm thế đấy ;) 30 char này :))
 
Mình check chiêu Huyền Thuỷ Cổ của bản thân mà, no ko chạy bạn ơi :9cool_pudency:

Mấy cái buff 30ph tốt nhất ko nên dùng marco xài :3cool_embarrassed: nó phụ thuộc vào tâm pháp trong trấn phái mà sẽ có id khác nhau. Nếu có tăng tâm pháp hổ trợ thì sẽ cho ra 1 id buff khác với khi ko tăng
 
function CheckBuff(target,id)
for z,x in pairs(target.GetBuffList()) do
if x.dwID==id then return true end
end
return false
end
function CheckCD(id)
local bOnCD,currentCDTime,totalCDTime=p.GetSkillCDProgress(id,p.GetSkillLevel(id))
return totalCDTime/16==0
end
p=GetClientPlayer()
T=GetTargetHandle(p.GetTarget())
HP=p.nCurrentLife*100/p.nMaxLife
if HP<20 and not CheckBuff (p,id) then Use(id) end
ai xem giùm e cái này cái e thêm phần not cheackbuff vao thì nó lại không dùng đc :9cool_canny:
 
if HP<20 and not CheckBuff (p,367) then Use(422) end
đấy có cái này thì lại ko đc and not CheckBuff:9cool_canny:
 
vừa đọc mấy bài trước, có người sử dụng "not" như sau:
if D>=3 and CheckBuff(p,3890) and H2>30 then U(233) end
if D>=3 and CheckBuff(p,3890) and H2<30 then U(243) end
if not(CheckBuff(p,3890)) and D>=3 then U(247) end


-> if HP<20 and not(CheckBuff(p,367)) then Use(422)

nhớ chú ý khoảng trắng nhé
 
Chỉnh sửa cuối:
if HP<20 and not CheckBuff (p,367) then Use(422) end
đấy có cái này thì lại ko đc and not CheckBuff:9cool_canny:

dư 1 space ngay sau chữ CheckBuff kìa :6cool_surrender:
Phải là ]if HP<20 and not CheckBuff(p,367) then Use(422) end chứ ko phải CheckBuff (p,367)
 
@bác Hà Anh:

bác cho em hỏi chút: nếu muốn check trên người mình đang có 1 cái buff, nếu có cái buff đấy thì ưu tiên sử dụng 1 số skill trong list định trước thì dùng hàm nào ạ :D Em cảm ơn bác :D
 
@bác Hà Anh:

bác cho em hỏi chút: nếu muốn check trên người mình đang có 1 cái buff, nếu có cái buff đấy thì ưu tiên sử dụng 1 số skill trong list định trước thì dùng hàm nào ạ :D Em cảm ơn bác :D

Bạn làm một hàm uselist như thế này chẳng hạn:
Mã:
function uselist(skillIDs)--sử dụng lần lượt skill nằm trong list
for z,x in pairs(skillIDs) do
	use(x) 
end
end
 
Back
Top