PDA

View Full Version : [JX] LINUX - Hàm Say mở rộng



f-fantasy
26-06-19, 10:26 PM
- Thông thường các hàm Say có sẵn của server mình thấy không đáp ứng được vấn đề là có nhiều, rất nhiều, cực nhiều lựa chọn.
- Khi có quá nhiều lựa chọn thì nó sẽ bị thiếu hoặc bị mất các lựa chọn đầu tiên chỉ có các lựa chọn về sau.
- Cũng có thể có người đã dev cái vấn đề đó rồi nhưng mình không tìm thấy thì mình tạo ra và share các bạn.
- Cách dùng hàm mới thì như sau


local nSelectPerPage = 10 --Nếu không khai báo thì nó mặc định là 10
local nDesc = "123123123"
local tbOpt = {
{"Lua chon 1",SayExTest,{Value}},
{"Lua chon 2",SayExTest,{Value1,Value2}},
}
SayEx(nDesc,tbOpt,nSelectPerPage) --Nếu chỗ này ko điền nSelectPerPage thì cũng được, hàm SayEx sẽ mặc định nó là 10

hoặc


local nSelectPerPage = 10
local nDesc = "123123123"
local tbOpt = { }
for i=1,20 do
tinsert(tbOpt,{"Dong lua chon "..i,SayExTest,{Value}})
end
SayExTest(nDesc,tbOpt,nSelectPerPage)

- Trong đó

nSelectPerPage : Tổng số lựa chọn trên 1 trang (không tính 3 dòng "Trang trước", "Trang sau", "Kết thúc đối thoại"
nDesc : Chỉ là lời thoại thôi
tbOpt : Danh sách các lựa chọn
SayExTest : Hàm mà nó sẽ chạy khi chọn lựa chọn
Value, Value1, Value2 : Các biến được gửi cùng với hàm SayExTest


- Với hàm mới này các bạn không cần thêm dòng "Kết thúc đối thoại" hàm SayEx sẽ tự động thêm cho các bạn
- Việc các bạn là đánh bao nhiêu tùy chọn cũng được chỉ vậy thôi.
Clip giải thích và nói về hàm mới : <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>


G_PlayerDailogData = {} --Dµnh cho hµm SayEX
function SayEx(nDesc,tbOpt,nSelectPerPage,nPage)
if nDesc == "" or nDesc == nil then nDesc = " " end
local nTotalSelect = getn(tbOpt)
if nPage == nil then nPage = 1 end
if nSelectPerPage == nil then nSelectPerPage = 10 end
local nStart = (nPage - 1) * nSelectPerPage + 1
local nEnd = nStart + nSelectPerPage - 1
if nStart > nTotalSelect then
return
end
if nEnd > nTotalSelect then
nEnd = nTotalSelect
end
local tbSayOpt = {}
for i=nStart, nEnd do
tinsert(tbSayOpt,{tbOpt[i][1],tbOpt[i][2],tbOpt[i][3]})
end
if nStart > 1 then
tinsert(tbSayOpt, {"Trang Tr­íc", SayEx, {nDesc,tbOpt,nSelectPerPage, nPage - 1}})
end
if nEnd < nTotalSelect then
tinsert(tbSayOpt, {"Trang Sau ", SayEx, {nDesc,tbOpt,nSelectPerPage, nPage + 1}})
end
tinsert(tbSayOpt, {"KÕt thóc ®èi tho¹i"})
G_PlayerDailogData[PlayerIndex] = tbSayOpt
local tb = {}
for i= 1, getn(tbSayOpt) do
tinsert(tb, tbSayOpt[i][1].. format("/#g_DailogBack(%d)", i))
end
if type(nDesc) == "number" then
Describe(nDesc, getn(tb), tb)
else
TaskSay("<dec>"..nDesc, tb)
end
end
function g_DailogBack(nSelectId, nCount) --Hâ trî hµm SayEx
local tbSayOpt = G_PlayerDailogData[PlayerIndex]
G_PlayerDailogData[PlayerIndex] = nil

if tbSayOpt and tbSayOpt[nSelectId] then
local nParamCount = getn(tbSayOpt[nSelectId])
if nParamCount == 1 then
return
elseif nParamCount == 2 then
local pFun = tbSayOpt[nSelectId][2]
pFun()
elseif nParamCount == 3 then
local pFun = tbSayOpt[nSelectId][2]
local tbParam = tbSayOpt[nSelectId][3]

call(pFun, tbParam)
end
end
end

traminh83
27-06-19, 10:24 AM
- Thông thường các hàm Say có sẵn của server mình thấy không đáp ứng được vấn đề là có nhiều, rất nhiều, cực nhiều lựa chọn.
- Khi có quá nhiều lựa chọn thì nó sẽ bị thiếu hoặc bị mất các lựa chọn đầu tiên chỉ có các lựa chọn về sau.
- Cũng có thể có người đã dev cái vấn đề đó rồi nhưng mình không tìm thấy thì mình tạo ra và share các bạn.
- Cách dùng hàm mới thì như sau


local nSelectPerPage = 10
local nDesc = "123123123"
local tbOpt = {
{"Lua chon 1",SayExTest,{Value}},
{"Lua chon 2",SayExTest,{Value1,Value2}},
}
SayEx(nDesc,tbOpt,nSelectPerPage)

hoặc


local nSelectPerPage = 10
local nDesc = "123123123"
local tbOpt = { }
for i=1,20 do
tinsert(tbOpt,{"Dong lua chon "..i,SayExTest,{Value}})
end
SayExTest(nDesc,tbOpt,nSelectPerPage)

- Trong đó

nSelectPerPage : Tổng số lựa chọn trên 1 trang (không tính 3 dòng "Trang trước", "Trang sau", "Kết thúc đối thoại"
nDesc : Chỉ là lời thoại thôi
tbOpt : Danh sách các lựa chọn
SayExTest : Hàm mà nó sẽ chạy khi chọn lựa chọn
Value, Value1, Value2 : Các biến được gửi cùng với hàm SayExTest


- Với hàm mới này các bạn không cần thêm dòng "Kết thúc đối thoại" hàm SayEx sẽ tự động thêm cho các bạn
- Việc các bạn là đánh bao nhiêu tùy chọn cũng được chỉ vậy thôi.
Clip giải thích và nói về hàm mới : <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>


function SayEx(nDesc,tbOpt,nSelectPerPage,nPage)
if nDesc == "" or nDesc == nil then nDesc = " " end
local nTotalSelect = getn(tbOpt)
if nPage == nil then nPage = 1 end
local nStart = (nPage - 1) * nSelectPerPage + 1
local nEnd = nStart + nSelectPerPage - 1
if nStart > nTotalSelect then
return
end
if nEnd > nTotalSelect then
nEnd = nTotalSelect
end
local tbSayOpt = {}
for i=nStart, nEnd do
tinsert(tbSayOpt,{tbOpt[i][1],tbOpt[i][2],tbOpt[i][3]})
end
if nStart > 1 then
tinsert(tbSayOpt, {"Trang Tr­íc", SayEx, {nDesc,tbOpt,nSelectPerPage, nPage - 1}})
end
if nEnd < nTotalSelect then
tinsert(tbSayOpt, {"Trang Sau ", SayEx, {nDesc,tbOpt,nSelectPerPage, nPage + 1}})
end
tinsert(tbSayOpt, {"KÕt thóc ®èi tho¹i"})
CreateNewSayEx(nDesc,tbSayOpt)
end

Mình áp dụng để không giới hạn số dòng trên 1 trang đúng không AD?

f-fantasy
27-06-19, 03:27 PM
Mình áp dụng để không giới hạn số dòng trên 1 trang đúng không AD?

Đúng rồi bạn, như clip mình làm ấy. 50 dòng cũng được nó sẽ tự chia ra

traminh83
27-06-19, 03:56 PM
Đúng rồi bạn, như clip mình làm ấy. 50 dòng cũng được nó sẽ tự chia ra

À, trong cái khung, thấy bạn có để thông tin bao gồm tên Map, id, tọa độ gì đó.
Cái id tọa độ thì mình dò hàm hiển thị được, nhưng cái tên map thì code như thế nào bạn? Lên forum search các lệnh JX Linux thấy có hàm SettingsGetCity() mà search trong tấc cả cá file script thì không thấy định nghĩa ở đâu hết.

f-fantasy
27-06-19, 06:53 PM
À, trong cái khung, thấy bạn có để thông tin bao gồm tên Map, id, tọa độ gì đó.
Cái id tọa độ thì mình dò hàm hiển thị được, nhưng cái tên map thì code như thế nào bạn? Lên forum search các lệnh JX Linux thấy có hàm SettingsGetCity() mà search trong tấc cả cá file script thì không thấy định nghĩa ở đâu hết.


aaa = SubWorldName(SubWorldID2Idx(53))
Msg2Player(aaa)

Sẽ trả về tên của Map có ID 53 là Ba Lăng Huyện

traminh83
28-06-19, 03:09 PM
aaa = SubWorldName(SubWorldID2Idx(53))
Msg2Player(aaa)

Sẽ trả về tên của Map có ID 53 là Ba Lăng Huyện

OK. Thanks bạn, đã thực hiện được.

ngotiendat
19-07-21, 11:52 PM
Mình gán vào sv linux thì báo lỗi tasksay nill value, bạn nào chỉ cách định nghĩa hàm mới trong jx linux giúp mình với, xin cảm ơn!

error: attempt to call global `TaskSay' (a nil value)
stack traceback:
1[154]: function `SayEx' at line 34