PDA

View Full Version : [JX] Share Script sắp xếp hạng cá nhân, xử lý file văn bản thuần!



bil4i3n
17-02-16, 11:32 PM
Các bác lấy về test xem có ổn định hông nha, lúc trước mình viết ra thì chính xác từng lượng Exp!
Ưu điểm là sếp hạng đến người cuối cùng trong game, truy xuất thẳng vào bảng, không dùng vòng lặp nên không ảnh hưởng đến hệ thống khi xác định hạng cá nhân
Nhược điểm là lúc tiến hành xếp hạng vẫn phải chạy 2 vòng for 1 vòng chạy lấy thông tin người A, 1 vòng lấy thông tin người A so với tất cả các người còn lại, và nói chung là nhược điểm hơi nhiều :D.
Khuyến cáo, không nên đem lên online, vì nếu đem lên on các bác phải biết cách cho nó chạy lúc bảo trì nếu mà để chạy theo s3relay thì cẩn thận treo máy chủ :D
vì vô tình chiều hôm nay mình dạo chơi thì tìm ra 1 cách xếp hạng cá nhân toàn bộ nhân vật của máy chủ 1 các đơn giản dễ chịu, nhẹ máy chủ hơn nhiều nên share script lại cho anh em tham khảo :D

Script main

IncludeLib("FILESYS")
Include ("\\script\\class\\ktabfile.lua")
bilNowDay = date("%Y%m%d")..GetLocalDate("%H%M%S")

bilWorldRank = {
FileTempNew = "bil4i3n_data/bil4i3n_worldrank_temp_new.txt",
FileTempNewTbFileLoad = "\\bil4i3n_data\\bil4i3n_worldrank_temp_new.txt",
FileTempNewHeader = "bilNamePlayer\tbilLevelPlayer",
FileTempOld = "bil4i3n_data/bil4i3n_worldrank_temp_old.txt",
FileTempOldTbFileLoad = "\\bil4i3n_data\\bil4i3n_worldrank_temp_old.txt",
FileCompared = "bil4i3n_data/bil4i3n_worldrank_compared.txt",
FileComparedTbFileLoad = "\\bil4i3n_data\\bil4i3n_worldrank_compared.txt",
FileRankSorted = "script/global/bil4i3n/bil4i3n_log/bil4i3n_worldrank_sorted.lua",
FileRankSortedTbFileLoad = "\\script\\global\\bil4i3n\\bil4i3n_log\\bil4i3n_wo rldrank_sorted.lua",
}

function bilWorldRank:UpdateDataPlayer()
if GetTask(5974) ~= tonumber(bilNowDay) then
if TabFile_Load(self.FileTempNewTbFileLoad, "bilNamePlayerUpdateData") ~= 1 then
local bilOpenFileTemp = openfile(self.FileTempNew, "a");
write(bilOpenFileTemp, self.FileTempNewHeader, "\n")
closefile(bilOpenFileTemp)
end
TabFile_UnLoad("bilNamePlayerUpdateData")
local bilOpenFileTemp = openfile(self.FileTempNew, "a");
write(bilOpenFileTemp, GetName().."\t"..GetLevel().."."..GetExpPercent(), "\n")
closefile(bilOpenFileTemp)
SetTask(5974, tonumber(bilNowDay))
end
end

function bilWorldRank:UpdateRankData()
print(" ");
print( "================================================== ======================================");
print(" bilWorldRank -> Update Data -> Start")
Msg2SubWord("HÖ thèng ®ang tiƠn hµnh lµm míi l¹i xƠp h¹ng c¸ nh©n toµn m¸y chñ!")
if TabFile_Load(self.FileTempNewTbFileLoad, self.FileTempNewTbFileLoad) ~= 1 then
print(" Khong tai duoc file FileTempNew! -> return")
return
else
if TabFile_Load(self.FileTempOldTbFileLoad, self.FileTempOldTbFileLoad) == 1 then
self.CompareFromData()
end
TabFile_UnLoad(self.FileTempOldTbFileLoad)
end
TabFile_UnLoad(self.FileTempNewTbFileLoad)
local bilTbTemp = {}
local bilDataNeedSort
if TabFile_Load(self.FileComparedTbFileLoad, self.FileComparedTbFileLoad) ~= 1 then
bilDataNeedSort = new(KTabFile, self.FileTempNewTbFileLoad, format("bilWorldRankSort_Check_%s", bilNowDay))
else
bilDataNeedSort = new(KTabFile, self.FileComparedTbFileLoad, format("bilWorldRankSort_Check_%s", bilNowDay))
end
for bilLoopDataSort = 1, bilDataNeedSort:getRow() do
tinsert(bilTbTemp, {bilDataNeedSort:getCell("bilNamePlayer", bilLoopDataSort), bilDataNeedSort:getCell("bilLevelPlayer", bilLoopDataSort)})
end
bilDataNeedSort:release()
sort(bilTbTemp, function (a, b) return(tonumber(a[2]) > tonumber(b[2])) end)
local bilOpenFileRanking = openfile(self.FileRankSorted, "w")
write(bilOpenFileRanking, "bil4i3nRankingData = {\n\t["..bilString2Byte("GM01").."] = {bilRankNum = "..bilNowDay..", bilNamePlayer = 'GM01'},", "\n")
for bilSave2Tb = 1, getn(bilTbTemp) do
write(bilOpenFileRanking, "\t["..bilString2Byte(bilTbTemp[bilSave2Tb][1]).."] = {bilRankNum = "..bilSave2Tb..", bilNamePlayer = '"..bilTbTemp[bilSave2Tb][1].."', bilLevelPlayer = "..bilTbTemp[bilSave2Tb][2].."},", "\n")
end
write(bilOpenFileRanking, "}", "\n")
closefile(bilOpenFileRanking)
self.ConvertFile()
print(" bilWorldRank -> Sorted -> Done")
dofile(bilWorldRank.FileRankSorted)
dofile("script/global/bil4i3n/bil4i3n_worldrank.lua")
print(" bilWorldRank -> dofile RankSorted -> Done")
Msg2SubWord("Lµm míi thø h¹ng giang hå cho ng­êi ch¬i toµn m¸y chñ hoµn tÊt!")
print( "================================================== ======================================");
end

function bilWorldRank:CompareFromData()
print(" bilWorldRank -> CompareFromData Old <> New -> Compared")
local bilOldData = new(KTabFile, bilWorldRank.FileTempOldTbFileLoad, format("bilWorldRank_OldData_%s", bilNowDay))
local bilNowData = new(KTabFile, bilWorldRank.FileTempNewTbFileLoad, format("bilWorldRank_New_%s", bilNowDay))
local bilRowNowData, bilCheckNum, bilWriteData2Compared = bilNowData:getRow(), 0, openfile(bilWorldRank.FileCompared, "w")
write(bilWriteData2Compared, bilWorldRank.FileTempNewHeader, "\n")
for bilLoopOldData = 1, bilOldData:getRow() do
for bilLoopNowData = 1, bilRowNowData do
if tostring(bilOldData:getCell("bilNamePlayer", bilLoopOldData)) ~= tostring(bilNowData:getCell("bilNamePlayer", bilLoopNowData)) then
bilCheckNum = bilCheckNum + 1
else
write(bilWriteData2Compared, tostring(bilNowData:getCell("bilNamePlayer", bilLoopNowData)).."\t"..tostring(bilNowData:getCell("bilLevelPlayer", bilLoopNowData)), "\n")
break
end
end
if bilCheckNum == bilRowNowData then
write(bilWriteData2Compared, tostring(bilOldData:getCell("bilNamePlayer", bilLoopOldData)).."\t"..tostring(bilOldData:getCell("bilLevelPlayer", bilLoopOldData)), "\n")
end
bilCheckNum = 0
end
for bilCompareDataNewWithOld = 1, bilNowData:getRow() do
bilCheckNum = 0
for bilOldDt = 1, bilOldData:getRow() do
if tostring(bilOldData:getCell("bilNamePlayer", bilOldDt)) ~= tostring(bilNowData:getCell("bilNamePlayer", bilCompareDataNewWithOld)) then
bilCheckNum = bilCheckNum + 1
end
end
if bilCheckNum == bilOldData:getRow() then
write(bilWriteData2Compared, tostring(bilNowData:getCell("bilNamePlayer", bilCompareDataNewWithOld)).."\t"..tostring(bilNowData:getCell("bilLevelPlayer", bilCompareDataNewWithOld)), "\n")
end
end
closefile(bilWriteData2Compared)
bilOldData:release()
bilNowData:release()
print(" bilWorldRank -> CompareFromData -> Complete")
end

function bilWorldRank:ConvertFile()
print(" ConvertFile -> Chuyen file Compared -> TempOld")
local bilOpenFileCompared
if TabFile_Load(bilWorldRank.FileComparedTbFileLoad, bilWorldRank.FileComparedTbFileLoad) ~= 1 then
print(" ConvertFile -> Khong tai duoc file Compared!")
if TabFile_Load(bilWorldRank.FileTempNewTbFileLoad, bilWorldRank.FileTempNewTbFileLoad) == 1 then
print(" ConvertFile -> FileTempNew -> Old")
bilOpenFileCompared = new(KTabFile, bilWorldRank.FileTempNewTbFileLoad, format("bilConvertCompared2Old_%s", bilNowDay))
else
print(" ConvertFile -> Khong duoc thuc hien!")
return
end
else
bilOpenFileCompared = new(KTabFile, bilWorldRank.FileComparedTbFileLoad, format("bilConvertCompared2Old_%s", bilNowDay))
end
TabFile_UnLoad(bilWorldRank.FileTempNewTbFileLoad)
TabFile_UnLoad(bilWorldRank.FileComparedTbFileLoad )
local bilOpenFileOld = openfile(bilWorldRank.FileTempOld, "w")
write(bilOpenFileOld, bilWorldRank.FileTempNewHeader, "\n")
for bilLoopDataConvert = 1, bilOpenFileCompared:getRow() do
write(bilOpenFileOld, tostring(bilOpenFileCompared:getCell("bilNamePlayer", bilLoopDataConvert)).."\t"..tostring(bilOpenFileCompared:getCell("bilLevelPlayer", bilLoopDataConvert)), "\n")
end
bilOpenFileCompared:release()
closefile(bilOpenFileOld)
print(" ConvertFile -> Lam moi file Compared")
local bilOpenFileComparedEmpty = openfile(bilWorldRank.FileCompared, "w");
closefile(bilOpenFileComparedEmpty)
print(" ConvertFile -> Lam moi file TempNew")
local bilOpenFileTemp = openfile(bilWorldRank.FileTempNew, "w");
write(bilOpenFileTemp, bilWorldRank.FileTempNewHeader, "\n")
closefile(bilOpenFileTemp)
print(" ConvertFile -> Done")
end

function bilWorldRank:GetWorldRank()
if GetTask(5972) ~= tonumber(date("%Y%m%d")) then
if TabFile_Load(bilWorldRank.FileRankSortedTbFileLoad , bilWorldRank.FileRankSortedTbFileLoad) ~= 1 then
if GetTask(5973) > 0 then
return GetTask(5973)
else
return "VÉn ch­a xƠp h¹ng"
end
else
TabFile_UnLoad(bilWorldRank.FileRankSortedTbFileLo ad)
dofile(bilWorldRank.FileRankSorted)
Include(bilWorldRank.FileRankSortedTbFileLoad)
end
if FALSE(bil4i3nRankingData[tonumber(bilString2Byte(GetName()))]) then
SetTask(5973, 0)
else
SetTask(5973, tonumber(bil4i3nRankingData[tonumber(bilString2Byte(GetName()))].bilRankNum))
end
SetTask(5972, tonumber(date("%Y%m%d")))
end
if GetTask(5973) <= 0 then
return "VÉn ch­a xƠp h¹ng"
else
return GetTask(5973)
end
end

function bilString2Byte(string)
local len, bilByteRet = strlen(string), ""
for i = 1, len do
bilByteRet = bilByteRet..strbyte(string, i)
end
return bilByteRet
end

function FALSE(nValue)
if (nValue == nil or nValue == 0 or nValue == "") then
return 1
else
return nil
end
end

Hướng dẫn dùng:
hàm: bilWorldRank:UpdateDataPlayer()
dùng để cập nhật thông tin người chơi vào file, các bác muốn lấy thông tin người chơi thì gọi hàm này ra.
hàm: bilWorldRank:UpdateRankData()
dùng để cập nhật, sắp xếp hạng người chơi vào 1 file .lua ra 1 bảng đã mã hóa tên người chơi thành các con số dạng Byte nhằm giúp truy cập 1 cách trực tiếp không cần vòng lặp hay thuật toán, khi hàm này chạy nó sẽ tạo ra file mới, file tạm, xóa file cũ, phục hồi lại file mới.
hàm: bilWorldRank:GetWorldRank() là hàm mà các bác muốn lấy thông tin thứ hạng người chơi hiển thị lên đâu đó :D

nhưng trước tiên các bác phải tạo thư mục: \server1\bil4i3n_data, sau đó tạo 1 file: bil4i3n_worldrank_temp_new.txt có nội dung như sau:

bilNamePlayer bilLevelPlayer

1 file với đường dẫn: \server1\script\global\bil4i3n\bil4i3n_log\bil4i3n _worldrank_sorted.lua với nội dung:

bil4i3nRankingData = {

}


Chúc các bác thành công!

kanhtien
18-02-16, 10:45 PM
Ai đã thử test chưa ?................................

minhduc_aa
23-02-16, 04:43 PM
Anh em ai có kinh nghiệm chỉ em cách reset lại BXH với, em dùng ver3 thì BXH bị đơ, log in hay log out gì nó đều không cập nhật, đã thử tạo file .lua như hướng dẫn của anh chủ topic nhưng không ăn thua. Có ai có thể team giúp em phát với, em cám ơn ạ.
Hình em nó đây ạ, sau khi em nâng đến 190 level rồi chuyển sinh ở NPC Nam cung nhất thiên thì dính lỗi này.
Đó giờ em cũng tắt secureCRT 3-2-1 trước rồi đến Paysys rồi Relaysys, sau khi đọc bài này lại có hướng tắt game kiểu khác. Anh có thể nói rõ hơn là tắt như thế nào thì đúng ạ. Mong anh em giúp để lại yahoo hay email để em liên lạc ạ.

Anh bil4i3n tối team giúp em tẩy não cái BXH với ạ, nó đơ đơ kiểu thế này hoài, yh em: minhduc_aa đó ạ.
<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>