PDA

View Full Version : [JX] LINUX - Tạo 1 hệ thống Lưu điểm kinh nghiệm, giao dịch điểm KN - Off tự sướng



f-fantasy
10-06-19, 08:12 PM
- Vẫn câu quen thuộc : Phục vụ chơi off tự sung sướng nhé.
- Vì chơi off nên có khá nhiều vấn đề sung sứong. Đơn cử như việc sẽ setup để làm sao điểm kinh nghiệm đạt được nhiều nhiều. Mà cắm chuột nó lên kịch 200 rồi nó phí hê hê. Cho nên mình nghĩ tới việc lưu lại điểm kinh nghiệm ra 1 file nào đó để xài dần.
- Điểm kinh nghiệm được lưu theo dạng tạo bảng lưu vào 1 file LUA chứ không dùng TASK hay PARAM cho nên bạn lưu vài trăm triệu ngàn tỷ điểm cũng được.
- Vì điểm kinh nghiệm được lưu nên bạn hoàn toàn có thể TRADE giao dịch với các nhân vật khác. Vui hầy.
Bước 1: Tạo 1 "Thư Viện" hàm.
- Tạo 1 file mới đặt tên funclib.lua (Để ở đâu trong thư mục script của bạn thì tuỳ)
- Mình sẽ viết các câu lệnh ví dụ như SaveExp, GetSaveExp, NewSaveExp.......Để các file khác sẽ Include đến file funclib.lua này mà sử dụng.
- Tại sao nên tạo funclib.lua.

Chắc các bạn quen với những câu hàm như GetLevel(), GetCash(), GetName() rồi đúng không, các câu lệnh này thường xuyên được sử dụng. Nó có sẵn trong thư viện hàm của server rồi.
Nếu bạn không tạo 1 "thư viện" thì mỗi lần muốn sử dụng hàm GetSaveExp() (Kiểm tra số điểm kinh nghiệm đã lưu lại) bạn lại phải viết lại (Định nghĩa lại) cả hàm thì nó mới hiểu. Và như vậy thì cực kỳ dài dòng rối rắm
Vậy hãy định nghĩa nó 1 lần vào funclib.lua xong mỗi lần muốn dùng hàm ở 1 file LUA khác hãy Include đến funclib.lua và dùng hàm gọn gàng đơn giản khỏi viết lại cả 1 đoạn dài.


- Các hàm cần tạo mới
Hàm Kiểm Tra

CheckSaveExp() : Kiểm tra xem nhân vật đang sử dụng đã từng lưu điểm kinh nghiệm chưa, nếu chưa từng lưu thì hàm trả về NIL
GetSaveExp() : Kiểm tra xem nhân vật đã lưu bao nhiêu điểm kinh nghiệm

Hàm Lưu Kinh Nghiệm Vào

PlayerSaveExp() : Hàm này sẽ rút hết điểm kinh nghiệm trên người nhân vật lưu vào dữ liệu. Mình không viết code đoạn nếu điểm kinh nghiệm trên người đang ÂM vì mình chơi 1 mình chả đánh nhau với ai, còn nếu bạn có nhu cầu thì bạn tự xử nhé
NewSaveExp() : Hàm sẽ tạo 1 data mới dành cho những nhân vật chưa từng lưu điểm kinh nghiệm bao giờ
AddSaveExp(nCount) : Lưu nCount điểm kinh nghiệm vào dữ liệu. Hàm này có thể dùng khi bạn ăn event chẳng hạn. Không muốn điểm ngấm vào nhân vật mà lưu luôn vào data thì sử dụng hàm này. Ví dụ ăn cái bánh event được 5.000.000 KN thì dùng AddSaveExp(5000000)

Hàm Lấy Kinh Nghiệm Ra

PaySaveExp(nCount) : Trừ đi nCount điểm kinh nghiệm có trong dữ liệu. Khi rút ra 5.000.000 ăn vào nhân vật thì phải trừ đi 5.000.000 trong dữ liệu (hay dễ hiểu là trong TÀI KHOẢN). Thực ra bạn có thể sử dụng chính hàm AddSaveExp với số điểm cần add là số âm cũng được. Nhưng tính mình thích rành rot rõ ràng nên tạo luôn 1 hàm trừ.
EarnSaveExp(nCount) : Lấy nCount điểm kinh nghiệm trong TÀI KHOẢN cộng vào nhân vật và trừ đi nCount điểm trong TÀI KHOẢN

- Các bạn có thể thắc mắc bản thân game có hàm AddOwnExp tại sao phải cho thêm cái hàm EarnSaveExp để cộng điểm kinh nghiệm vào nhân vật.

Mình tạo hàm Pay để trừ điểm có trong TÀI KHOẢN. Và muốn kết hợp với hàm EARN trong trường hợp muốn cộng điểm vào chính nhân vật. Tức là khi sử dụng EARN nó sẽ tự động trừ đi thông qua hàm PAY
Vậy trường hợp GIAO DỊCH điểm kinh nghiệm? Lúc này chỉ trừ điểm có trong TÀI KHOẢN (Chỉ dùng hàm PAY) mà lại không cộng nó vào nhân vật. Nó chuyển số điểm đó sang TÀI KHOẢN của nhân vật khác.

Hàm đọc số có nhiều chữ số

ShowBigNumber : Bạn lưu 1 tỷ điểm kinh nghiệm vào và nếu không tạo 1 cái hàm đọc con số 1 tỷ này cho rành rọt thì toặc máu mắt ngồi đếm SỐ CHỮ SỐ.
Ví dụ bạn lưu 1.945.200.100 điểm thì khi sử dụng hàm này nó sẽ đọc thành dạng 1 Tỷ 945 Triệu 200 Nghìn 100 Điểm Kinh Nghiệm. Tiện hơn cho bạn dùng với Msg2Player hiện thông báo cho người chơi thấy


Bước 2 : Tạo 1 file lưu TÀI KHOẢN
- Tạo 1 file expdata.lua để ở đâu là tùy bạn (Lát trong code chỉ đường dẫn đúng tới nó là OK)
Nội dung file

ExpData={

}
Bước 3: Các code trong Funclib.lua
- Trước hết nó cần Include file Include("\\script\\00ff\\data\\expdata.lua")
- Hàm CheckSaveExp()

function CheckSaveExp()
---Hµm nµy sÏ kiÓm tra xem nh©n vËt ®· tơng că d÷ liÖu luu KN hay ch­a
for i=1,getn(ExpData) do
if GetUUID() == ExpData[i][2] then
return i
end
end
--NƠu ch­a tơng l­u th× gi¸ tr̃ tr¶ v̉ lµ NIL cßn ®· tơng l­u th× gi¸ tr̃ tr¶ v̉ chƯnh lµ ṽ trƯ ®· l­u trong b¶ng ExpData
end
- Hàm GetSaveExp()

function GetSaveExp()
return ExpData[CheckSaveExp()][3]
end
- Hàm PlayerSaveExp

function PlayerSaveExp()
--Hµm l­u toµn bé Exp trªn ng­êi.
local ExpPlayer = GetExp() --Exp ®ang co trªn ng­êi
local TongExpNew = ExpPlayer + ExpData[CheckSaveExp()][3]
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(ExpPlayer,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(ExpData[CheckSaveExp()][3],2).." ®iÓm kinh nghiÖm.")
ReduceOwnExp(ExpPlayer) --Xo¸ hªt exp trªn ng­êi
end
-Hàm NewSaveExp

function NewSaveExp() --T¹o data míi cho nh©n vËt ch­a CS bao giê
if CheckSaveExp() == nil then --Nh©n vËt ch­a tơng l­u
local Vitri = getn(ExpData)+1
ExpData[Vitri] = {}
ExpData[Vitri][1] = GetName()
ExpData[Vitri][2] = GetUUID()
ExpData[Vitri][3] = 0
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
end
end
- Hàm AddSaveExp

function AddSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm AddSaveExp kh«ng x¸c ®̃nh")
end
local TongExpNew = nCount + GetSaveExp()
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(nCount,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(GetSaveExp(),2)..".")
end
- Hàm PaySaveExp(nCount)

function PaySaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm PaySaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
local TongExpNew = GetSaveExp() - nCount
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Rót ra "..ShowBigNumber(nCount,2)..".")
Msg2Player("Cßn l¹i "..ShowBigNumber(GetSaveExp(),2)..".")
end
- Hàm EarnSaveExp(nCount)

function EarnSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm EarnSaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
AddOwnExp(nCount)
PaySaveExp(nCount)
Msg2Player("Céng "..ShowBigNumber(nCount,2).." vµo nh©n vËt.")
end
- Hàm ShowBigNumber
Hàm này mình viết cũng lâu rồi, nó đọc cả số TIỀN và ĐIỂM KN. Mình lười xóa cái đoạn đọc tiền đi nên để nguyên nhé
Cách dùng
ShowBigNumber(10000,1) --Nó sẽ đọc là 1 Vạn
ShowBigNumber(10000,2) --Nó sẽ đọc là 10 nghìn

function ShowBigNumber(Value,Type)
local NumberString = tostring(Value)
local DoDai = strlen(NumberString)
if Type == 0 or Type == nil then
return "Kh«ng x¸c ®̃nh"
end
if Type == 1 then --§äc sè tỉn
if DoDai <= 4 then
return "<color=yellow>"..NumberString.."<color> l­îng"
elseif DoDai > 4 and DoDai <= 8 then--Tơ 1.0000 ®Ơn 9999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 4)
local nY = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> v¹n <color=yellow>"..nY.."<color> l­îng"
elseif DoDai > 8 and DoDai <=10 then --Tơ 10.000.0000 ®Ơn 999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 7)
local nY = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nZ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> v¹n <color=yellow>"..nZ.."<color> l­îng"
elseif DoDai > 10 and DoDai <= 13 then--Tơ 1.000.000.0000 v¹n 999.999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 10)
local nY = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nZ = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
elseif DoDai > 13 then
local nX = strsub(tostring(Value),1,DoDai - 13)
local nY = strsub(tostring(Value),DoDai - 12,DoDai - 10)
local nZ = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nI = strsub(tostring(Value),DoDai - 6,DoDai-4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nI.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
end
elseif Type == 2 then --§äc sè ®iÓm kinh nghiÖm
if DoDai <= 3 then
return "<color=yellow>"..NumberString.."<color> kinh nghiÖm"
elseif DoDai > 3 and DoDai <= 6 then--Tơ 1000 ®Ơn 999.999
local nX = strsub(tostring(Value),1,DoDai - 3)
local nY = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> kinh nghiÖm"
elseif DoDai > 6 and DoDai <=9 then --Tơ 1.000.000 ®Ơn 999.999.999
local nX = strsub(tostring(Value),1,DoDai - 6)
local nY = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nZ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> kinh nghiÖm"
--elseif DoDai > 9 and DoDai <= 12 then--Tơ 1.000.000.000 ®Ơn 999.999.999.999 1 tû ®Ơn 999 tû
elseif DoDai > 9 then--Tơ 1.000.000.000
local nX = strsub(tostring(Value),1,DoDai - 9)
local nY = strsub(tostring(Value),DoDai - 8,DoDai - 6)
local nZ = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nJ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nJ.."<color> kinh nghiÖm"
end
end

end
Bước 4 : Thiết lập mỗi khi đăng nhập sẽ check xem nhân vật có TÀI KHOẢN chưa, chưa có thì add TÀI KHOẢN tự động
- Mở \jxser\server1\script\global\login_head.lua

- Thêm đoạn này vào AddLoginFileFunction("\\script\\00ff\\funclib.lua","NewSaveExp") cuối cùng của file
- Vậy là nhân vật mới tạo mới, hoặc login vào game là nó sẽ auto chạy cái hàm NewSaveExp() mình viết ở trên.
- Vì đã làm bước 4 này thì tất cả các nhân vật của bạn từ lúc tạo mới login vào game là lập tức được tạo TÀI KHOẢN, cho nên các hàm trong THƯ VIỆN bên trên mình không hề cho CHECK xem đã có tài khoản hay chưa. Vì chắc chắn đã có

Toàn bộ file funclib.lua

Include("\\script\\00ff\\data\\expdata.lua")
function CheckSaveExp()
---Hµm nµy sÏ kiÓm tra xem nh©n vËt ®· tơng că d÷ liÖu luu KN hay ch­a
for i=1,getn(ExpData) do
if GetUUID() == ExpData[i][2] then
return i
end
end
--NƠu ch­a tơng l­u th× gi¸ tr̃ tr¶ v̉ lµ NIL cßn ®· tơng l­u th× gi¸ tr̃ tr¶ v̉ chƯnh lµ ṽ trƯ ®· l­u trong b¶ng ExpData
end
function GetSaveExp()
return ExpData[CheckSaveExp()][3]
end
function AddSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm AddSaveExp kh«ng x¸c ®̃nh")
end
local TongExpNew = nCount + GetSaveExp()
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(nCount,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(GetSaveExp(),2)..".")
end
function PaySaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm PaySaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
local TongExpNew = GetSaveExp() - nCount
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Rót ra "..ShowBigNumber(nCount,2)..".")
Msg2Player("Cßn l¹i "..ShowBigNumber(GetSaveExp(),2)..".")
end
function EarnSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm EarnSaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
AddOwnExp(nCount)
PaySaveExp(nCount)
Msg2Player("Céng "..ShowBigNumber(nCount,2).." vµo nh©n vËt.")
end
function SaveExpPlayer()
--Hµm l­u toµn bé Exp trªn ng­êi.
local ExpPlayer = GetExp() --Exp ®ang co trªn ng­êi
local TongExpNew = ExpPlayer + ExpData[CheckSaveExp()][3]
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(ExpPlayer,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(ExpData[CheckSaveExp()][3],2).." ®iÓm kinh nghiÖm.")
ReduceOwnExp(ExpPlayer) --Xo¸ hªt exp trªn ng­êi
end
function NewSaveExp() --T¹o data míi cho nh©n vËt ch­a CS bao giê
if CheckSaveExp() == nil then --Nh©n vËt ch­a tơng l­u
local Vitri = getn(ExpData)+1
ExpData[Vitri] = {}
ExpData[Vitri][1] = GetName()
ExpData[Vitri][2] = GetUUID()
ExpData[Vitri][3] = 0
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
end
end
function ShowBigNumber(Value,Type)
local NumberString = tostring(Value)
local DoDai = strlen(NumberString)
if Type == 0 or Type == nil then
return "Kh«ng x¸c ®̃nh"
end
if Type == 1 then --§äc sè tỉn
if DoDai <= 4 then
return "<color=yellow>"..NumberString.."<color> l­îng"
elseif DoDai > 4 and DoDai <= 8 then--Tơ 1.0000 ®Ơn 9999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 4)
local nY = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> v¹n <color=yellow>"..nY.."<color> l­îng"
elseif DoDai > 8 and DoDai <=10 then --Tơ 10.000.0000 ®Ơn 999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 7)
local nY = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nZ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> v¹n <color=yellow>"..nZ.."<color> l­îng"
elseif DoDai > 10 and DoDai <= 13 then--Tơ 1.000.000.0000 v¹n 999.999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 10)
local nY = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nZ = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
elseif DoDai > 13 then
local nX = strsub(tostring(Value),1,DoDai - 13)
local nY = strsub(tostring(Value),DoDai - 12,DoDai - 10)
local nZ = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nI = strsub(tostring(Value),DoDai - 6,DoDai-4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nI.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
end
elseif Type == 2 then --§äc sè ®iÓm kinh nghiÖm
if DoDai <= 3 then
return "<color=yellow>"..NumberString.."<color> kinh nghiÖm"
elseif DoDai > 3 and DoDai <= 6 then--Tơ 1000 ®Ơn 999.999
local nX = strsub(tostring(Value),1,DoDai - 3)
local nY = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> kinh nghiÖm"
elseif DoDai > 6 and DoDai <=9 then --Tơ 1.000.000 ®Ơn 999.999.999
local nX = strsub(tostring(Value),1,DoDai - 6)
local nY = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nZ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> kinh nghiÖm"
--elseif DoDai > 9 and DoDai <= 12 then--Tơ 1.000.000.000 ®Ơn 999.999.999.999 1 tû ®Ơn 999 tû
elseif DoDai > 9 then--Tơ 1.000.000.000
local nX = strsub(tostring(Value),1,DoDai - 9)
local nY = strsub(tostring(Value),DoDai - 8,DoDai - 6)
local nZ = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nJ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nJ.."<color> kinh nghiÖm"
end
end

end

CHÚ Ý
- Tất cả Code ở trên nếu bạn thấy có nào có đường dẫn thì phải thay lại thành đường dẫn của bạn cho phù hợp.
- Mình không nói kỹ về vấn đề TRADE điểm KN vì các hàm cơ bản đã có. Bạn có thể dùng hàm GetUUID() Có sẵn của server để tìm ra chính xác vị trí lưu điểm kinh nghiệm của nhân vật rồi TRADE với nhau.
- Tương tự các bạn có thể viết hàm LƯU TIỀN, LƯU ITEM. Cũng là 2 vấn đề của anh em chơi tự sướng. Tiền rớt quá nhiều mà mỗi nhân vật được cất hòm có 200k vạn thì phải là max. Vậy thì SAVE nó lại.
- Lưu ITEM thì khó khăn hơn vì nó có nhiều thông số.
- Hệ thống mới coi như hình thành. Khi các bạn cần sử dụng các hàm mới thì nhớ Include file funclib.lua vào là được
- Chúc các bạn quay tay sung sướng những ngày hè oi ả
Video demo : <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>
Pic : Cắm 4 con trên map Bãi Luyện Công (Được tạo thêm) 2 hay 3 ngày hôm nay rồi. Với hệ thống save item, save money, save exp, và sửa đồ
<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>

qd3097
03-11-19, 08:22 AM
- Vẫn câu quen thuộc : Phục vụ chơi off tự sung sướng nhé.
- Vì chơi off nên có khá nhiều vấn đề sung sứong. Đơn cử như việc sẽ setup để làm sao điểm kinh nghiệm đạt được nhiều nhiều. Mà cắm chuột nó lên kịch 200 rồi nó phí hê hê. Cho nên mình nghĩ tới việc lưu lại điểm kinh nghiệm ra 1 file nào đó để xài dần.
- Điểm kinh nghiệm được lưu theo dạng tạo bảng lưu vào 1 file LUA chứ không dùng TASK hay PARAM cho nên bạn lưu vài trăm triệu ngàn tỷ điểm cũng được.
- Vì điểm kinh nghiệm được lưu nên bạn hoàn toàn có thể TRADE giao dịch với các nhân vật khác. Vui hầy.
Bước 1: Tạo 1 "Thư Viện" hàm.
- Tạo 1 file mới đặt tên funclib.lua (Để ở đâu trong thư mục script của bạn thì tuỳ)
- Mình sẽ viết các câu lệnh ví dụ như SaveExp, GetSaveExp, NewSaveExp.......Để các file khác sẽ Include đến file funclib.lua này mà sử dụng.
- Tại sao nên tạo funclib.lua.

Chắc các bạn quen với những câu hàm như GetLevel(), GetCash(), GetName() rồi đúng không, các câu lệnh này thường xuyên được sử dụng. Nó có sẵn trong thư viện hàm của server rồi.
Nếu bạn không tạo 1 "thư viện" thì mỗi lần muốn sử dụng hàm GetSaveExp() (Kiểm tra số điểm kinh nghiệm đã lưu lại) bạn lại phải viết lại (Định nghĩa lại) cả hàm thì nó mới hiểu. Và như vậy thì cực kỳ dài dòng rối rắm
Vậy hãy định nghĩa nó 1 lần vào funclib.lua xong mỗi lần muốn dùng hàm ở 1 file LUA khác hãy Include đến funclib.lua và dùng hàm gọn gàng đơn giản khỏi viết lại cả 1 đoạn dài.


- Các hàm cần tạo mới
Hàm Kiểm Tra

CheckSaveExp() : Kiểm tra xem nhân vật đang sử dụng đã từng lưu điểm kinh nghiệm chưa, nếu chưa từng lưu thì hàm trả về NIL
GetSaveExp() : Kiểm tra xem nhân vật đã lưu bao nhiêu điểm kinh nghiệm

Hàm Lưu Kinh Nghiệm Vào

PlayerSaveExp() : Hàm này sẽ rút hết điểm kinh nghiệm trên người nhân vật lưu vào dữ liệu. Mình không viết code đoạn nếu điểm kinh nghiệm trên người đang ÂM vì mình chơi 1 mình chả đánh nhau với ai, còn nếu bạn có nhu cầu thì bạn tự xử nhé
NewSaveExp() : Hàm sẽ tạo 1 data mới dành cho những nhân vật chưa từng lưu điểm kinh nghiệm bao giờ
AddSaveExp(nCount) : Lưu nCount điểm kinh nghiệm vào dữ liệu. Hàm này có thể dùng khi bạn ăn event chẳng hạn. Không muốn điểm ngấm vào nhân vật mà lưu luôn vào data thì sử dụng hàm này. Ví dụ ăn cái bánh event được 5.000.000 KN thì dùng AddSaveExp(5000000)

Hàm Lấy Kinh Nghiệm Ra

PaySaveExp(nCount) : Trừ đi nCount điểm kinh nghiệm có trong dữ liệu. Khi rút ra 5.000.000 ăn vào nhân vật thì phải trừ đi 5.000.000 trong dữ liệu (hay dễ hiểu là trong TÀI KHOẢN). Thực ra bạn có thể sử dụng chính hàm AddSaveExp với số điểm cần add là số âm cũng được. Nhưng tính mình thích rành rot rõ ràng nên tạo luôn 1 hàm trừ.
EarnSaveExp(nCount) : Lấy nCount điểm kinh nghiệm trong TÀI KHOẢN cộng vào nhân vật và trừ đi nCount điểm trong TÀI KHOẢN

- Các bạn có thể thắc mắc bản thân game có hàm AddOwnExp tại sao phải cho thêm cái hàm EarnSaveExp để cộng điểm kinh nghiệm vào nhân vật.

Mình tạo hàm Pay để trừ điểm có trong TÀI KHOẢN. Và muốn kết hợp với hàm EARN trong trường hợp muốn cộng điểm vào chính nhân vật. Tức là khi sử dụng EARN nó sẽ tự động trừ đi thông qua hàm PAY
Vậy trường hợp GIAO DỊCH điểm kinh nghiệm? Lúc này chỉ trừ điểm có trong TÀI KHOẢN (Chỉ dùng hàm PAY) mà lại không cộng nó vào nhân vật. Nó chuyển số điểm đó sang TÀI KHOẢN của nhân vật khác.

Hàm đọc số có nhiều chữ số

ShowBigNumber : Bạn lưu 1 tỷ điểm kinh nghiệm vào và nếu không tạo 1 cái hàm đọc con số 1 tỷ này cho rành rọt thì toặc máu mắt ngồi đếm SỐ CHỮ SỐ.
Ví dụ bạn lưu 1.945.200.100 điểm thì khi sử dụng hàm này nó sẽ đọc thành dạng 1 Tỷ 945 Triệu 200 Nghìn 100 Điểm Kinh Nghiệm. Tiện hơn cho bạn dùng với Msg2Player hiện thông báo cho người chơi thấy


Bước 2 : Tạo 1 file lưu TÀI KHOẢN
- Tạo 1 file expdata.lua để ở đâu là tùy bạn (Lát trong code chỉ đường dẫn đúng tới nó là OK)
Nội dung file

ExpData={

}
Bước 3: Các code trong Funclib.lua
- Trước hết nó cần Include file Include("\\script\\00ff\\data\\expdata.lua")
- Hàm CheckSaveExp()

function CheckSaveExp()
---Hµm nµy sÏ kiÓm tra xem nh©n vËt ®· tơng că d÷ liÖu luu KN hay ch­a
for i=1,getn(ExpData) do
if GetUUID() == ExpData[i][2] then
return i
end
end
--NƠu ch­a tơng l­u th× gi¸ tr̃ tr¶ v̉ lµ NIL cßn ®· tơng l­u th× gi¸ tr̃ tr¶ v̉ chƯnh lµ ṽ trƯ ®· l­u trong b¶ng ExpData
end
- Hàm GetSaveExp()

function GetSaveExp()
return ExpData[CheckSaveExp()][3]
end
- Hàm PlayerSaveExp

function PlayerSaveExp()
--Hµm l­u toµn bé Exp trªn ng­êi.
local ExpPlayer = GetExp() --Exp ®ang co trªn ng­êi
local TongExpNew = ExpPlayer + ExpData[CheckSaveExp()][3]
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(ExpPlayer,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(ExpData[CheckSaveExp()][3],2).." ®iÓm kinh nghiÖm.")
ReduceOwnExp(ExpPlayer) --Xo¸ hªt exp trªn ng­êi
end
-Hàm NewSaveExp

function NewSaveExp() --T¹o data míi cho nh©n vËt ch­a CS bao giê
if CheckSaveExp() == nil then --Nh©n vËt ch­a tơng l­u
local Vitri = getn(ExpData)+1
ExpData[Vitri] = {}
ExpData[Vitri][1] = GetName()
ExpData[Vitri][2] = GetUUID()
ExpData[Vitri][3] = 0
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
end
end
- Hàm AddSaveExp

function AddSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm AddSaveExp kh«ng x¸c ®̃nh")
end
local TongExpNew = nCount + GetSaveExp()
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(nCount,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(GetSaveExp(),2)..".")
end
- Hàm PaySaveExp(nCount)

function PaySaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm PaySaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
local TongExpNew = GetSaveExp() - nCount
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Rót ra "..ShowBigNumber(nCount,2)..".")
Msg2Player("Cßn l¹i "..ShowBigNumber(GetSaveExp(),2)..".")
end
- Hàm EarnSaveExp(nCount)

function EarnSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm EarnSaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
AddOwnExp(nCount)
PaySaveExp(nCount)
Msg2Player("Céng "..ShowBigNumber(nCount,2).." vµo nh©n vËt.")
end
- Hàm ShowBigNumber
Hàm này mình viết cũng lâu rồi, nó đọc cả số TIỀN và ĐIỂM KN. Mình lười xóa cái đoạn đọc tiền đi nên để nguyên nhé
Cách dùng
ShowBigNumber(10000,1) --Nó sẽ đọc là 1 Vạn
ShowBigNumber(10000,2) --Nó sẽ đọc là 10 nghìn

function ShowBigNumber(Value,Type)
local NumberString = tostring(Value)
local DoDai = strlen(NumberString)
if Type == 0 or Type == nil then
return "Kh«ng x¸c ®̃nh"
end
if Type == 1 then --§äc sè tỉn
if DoDai <= 4 then
return "<color=yellow>"..NumberString.."<color> l­îng"
elseif DoDai > 4 and DoDai <= 8 then--Tơ 1.0000 ®Ơn 9999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 4)
local nY = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> v¹n <color=yellow>"..nY.."<color> l­îng"
elseif DoDai > 8 and DoDai <=10 then --Tơ 10.000.0000 ®Ơn 999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 7)
local nY = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nZ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> v¹n <color=yellow>"..nZ.."<color> l­îng"
elseif DoDai > 10 and DoDai <= 13 then--Tơ 1.000.000.0000 v¹n 999.999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 10)
local nY = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nZ = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
elseif DoDai > 13 then
local nX = strsub(tostring(Value),1,DoDai - 13)
local nY = strsub(tostring(Value),DoDai - 12,DoDai - 10)
local nZ = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nI = strsub(tostring(Value),DoDai - 6,DoDai-4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nI.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
end
elseif Type == 2 then --§äc sè ®iÓm kinh nghiÖm
if DoDai <= 3 then
return "<color=yellow>"..NumberString.."<color> kinh nghiÖm"
elseif DoDai > 3 and DoDai <= 6 then--Tơ 1000 ®Ơn 999.999
local nX = strsub(tostring(Value),1,DoDai - 3)
local nY = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> kinh nghiÖm"
elseif DoDai > 6 and DoDai <=9 then --Tơ 1.000.000 ®Ơn 999.999.999
local nX = strsub(tostring(Value),1,DoDai - 6)
local nY = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nZ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> kinh nghiÖm"
--elseif DoDai > 9 and DoDai <= 12 then--Tơ 1.000.000.000 ®Ơn 999.999.999.999 1 tû ®Ơn 999 tû
elseif DoDai > 9 then--Tơ 1.000.000.000
local nX = strsub(tostring(Value),1,DoDai - 9)
local nY = strsub(tostring(Value),DoDai - 8,DoDai - 6)
local nZ = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nJ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nJ.."<color> kinh nghiÖm"
end
end

end
Bước 4 : Thiết lập mỗi khi đăng nhập sẽ check xem nhân vật có TÀI KHOẢN chưa, chưa có thì add TÀI KHOẢN tự động
- Mở \jxser\server1\script\global\login_head.lua

- Thêm đoạn này vào AddLoginFileFunction("\\script\\00ff\\funclib.lua","NewSaveExp") cuối cùng của file
- Vậy là nhân vật mới tạo mới, hoặc login vào game là nó sẽ auto chạy cái hàm NewSaveExp() mình viết ở trên.
- Vì đã làm bước 4 này thì tất cả các nhân vật của bạn từ lúc tạo mới login vào game là lập tức được tạo TÀI KHOẢN, cho nên các hàm trong THƯ VIỆN bên trên mình không hề cho CHECK xem đã có tài khoản hay chưa. Vì chắc chắn đã có

Toàn bộ file funclib.lua

Include("\\script\\00ff\\data\\expdata.lua")
function CheckSaveExp()
---Hµm nµy sÏ kiÓm tra xem nh©n vËt ®· tơng că d÷ liÖu luu KN hay ch­a
for i=1,getn(ExpData) do
if GetUUID() == ExpData[i][2] then
return i
end
end
--NƠu ch­a tơng l­u th× gi¸ tr̃ tr¶ v̉ lµ NIL cßn ®· tơng l­u th× gi¸ tr̃ tr¶ v̉ chƯnh lµ ṽ trƯ ®· l­u trong b¶ng ExpData
end
function GetSaveExp()
return ExpData[CheckSaveExp()][3]
end
function AddSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm AddSaveExp kh«ng x¸c ®̃nh")
end
local TongExpNew = nCount + GetSaveExp()
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(nCount,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(GetSaveExp(),2)..".")
end
function PaySaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm PaySaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
local TongExpNew = GetSaveExp() - nCount
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Rót ra "..ShowBigNumber(nCount,2)..".")
Msg2Player("Cßn l¹i "..ShowBigNumber(GetSaveExp(),2)..".")
end
function EarnSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm EarnSaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
AddOwnExp(nCount)
PaySaveExp(nCount)
Msg2Player("Céng "..ShowBigNumber(nCount,2).." vµo nh©n vËt.")
end
function SaveExpPlayer()
--Hµm l­u toµn bé Exp trªn ng­êi.
local ExpPlayer = GetExp() --Exp ®ang co trªn ng­êi
local TongExpNew = ExpPlayer + ExpData[CheckSaveExp()][3]
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(ExpPlayer,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(ExpData[CheckSaveExp()][3],2).." ®iÓm kinh nghiÖm.")
ReduceOwnExp(ExpPlayer) --Xo¸ hªt exp trªn ng­êi
end
function NewSaveExp() --T¹o data míi cho nh©n vËt ch­a CS bao giê
if CheckSaveExp() == nil then --Nh©n vËt ch­a tơng l­u
local Vitri = getn(ExpData)+1
ExpData[Vitri] = {}
ExpData[Vitri][1] = GetName()
ExpData[Vitri][2] = GetUUID()
ExpData[Vitri][3] = 0
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
end
end
function ShowBigNumber(Value,Type)
local NumberString = tostring(Value)
local DoDai = strlen(NumberString)
if Type == 0 or Type == nil then
return "Kh«ng x¸c ®̃nh"
end
if Type == 1 then --§äc sè tỉn
if DoDai <= 4 then
return "<color=yellow>"..NumberString.."<color> l­îng"
elseif DoDai > 4 and DoDai <= 8 then--Tơ 1.0000 ®Ơn 9999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 4)
local nY = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> v¹n <color=yellow>"..nY.."<color> l­îng"
elseif DoDai > 8 and DoDai <=10 then --Tơ 10.000.0000 ®Ơn 999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 7)
local nY = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nZ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> v¹n <color=yellow>"..nZ.."<color> l­îng"
elseif DoDai > 10 and DoDai <= 13 then--Tơ 1.000.000.0000 v¹n 999.999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 10)
local nY = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nZ = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
elseif DoDai > 13 then
local nX = strsub(tostring(Value),1,DoDai - 13)
local nY = strsub(tostring(Value),DoDai - 12,DoDai - 10)
local nZ = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nI = strsub(tostring(Value),DoDai - 6,DoDai-4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nI.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
end
elseif Type == 2 then --§äc sè ®iÓm kinh nghiÖm
if DoDai <= 3 then
return "<color=yellow>"..NumberString.."<color> kinh nghiÖm"
elseif DoDai > 3 and DoDai <= 6 then--Tơ 1000 ®Ơn 999.999
local nX = strsub(tostring(Value),1,DoDai - 3)
local nY = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> kinh nghiÖm"
elseif DoDai > 6 and DoDai <=9 then --Tơ 1.000.000 ®Ơn 999.999.999
local nX = strsub(tostring(Value),1,DoDai - 6)
local nY = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nZ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> kinh nghiÖm"
--elseif DoDai > 9 and DoDai <= 12 then--Tơ 1.000.000.000 ®Ơn 999.999.999.999 1 tû ®Ơn 999 tû
elseif DoDai > 9 then--Tơ 1.000.000.000
local nX = strsub(tostring(Value),1,DoDai - 9)
local nY = strsub(tostring(Value),DoDai - 8,DoDai - 6)
local nZ = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nJ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nJ.."<color> kinh nghiÖm"
end
end

end

CHÚ Ý
- Tất cả Code ở trên nếu bạn thấy có nào có đường dẫn thì phải thay lại thành đường dẫn của bạn cho phù hợp.
- Mình không nói kỹ về vấn đề TRADE điểm KN vì các hàm cơ bản đã có. Bạn có thể dùng hàm GetUUID() Có sẵn của server để tìm ra chính xác vị trí lưu điểm kinh nghiệm của nhân vật rồi TRADE với nhau.
- Tương tự các bạn có thể viết hàm LƯU TIỀN, LƯU ITEM. Cũng là 2 vấn đề của anh em chơi tự sướng. Tiền rớt quá nhiều mà mỗi nhân vật được cất hòm có 200k vạn thì phải là max. Vậy thì SAVE nó lại.
- Lưu ITEM thì khó khăn hơn vì nó có nhiều thông số.
- Hệ thống mới coi như hình thành. Khi các bạn cần sử dụng các hàm mới thì nhớ Include file funclib.lua vào là được
- Chúc các bạn quay tay sung sướng những ngày hè oi ả
Video demo : <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>
Pic : Cắm 4 con trên map Bãi Luyện Công (Được tạo thêm) 2 hay 3 ngày hôm nay rồi. Với hệ thống save item, save money, save exp, và sửa đồ
<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>

Bác cho hỏi 2 cái hàm TaoBang và SaveData ở đâu vậy, tui cóp vào bị lỗi do thiếu 2 cái hàm này.

local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00/global/expbank/expdata.lua",Data)

Thanks

f-fantasy
09-11-19, 11:59 PM
Bác cho hỏi 2 cái hàm TaoBang và SaveData ở đâu vậy, tui cóp vào bị lỗi do thiếu 2 cái hàm này.

local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00/global/expbank/expdata.lua",Data)

Thanks


function TaoBang(tTable, sTableName, sTab)
sTab = sTab or "";
sTmp = ""
sTmp = sTmp..sTab..sTableName.."={"

local tStart = 0
for key, value in tTable do

if tStart == 1 then
sTmp = sTmp..",\r\n"

else
sTmp = sTmp.."\r\n"
tStart = 1
end
local sKey = (type(key) == "string") and format("[%q]",key) or format("[%d]",key);
if(type(value) == "table") then
sTmp = sTmp..TaoBang(value, sKey, sTab.."\t");
else
local sValue = (type(value) == "string") and format("%q",value) or tostring(value);
sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
end

end
sTmp = sTmp.."\r\n"..sTab.."}"
--Msg2Player(sTmp)
return sTmp

end
function SaveData(file, string)
local f,e = openfile( file, "w+" )
if f then
write(f,string)
closefile(f)
return 1
else
local _,_,path = strfind(file, "(.+[/_\\]).+$")
if path ~= nil then execute("mkdir ".."\""..gsub(path, "/", "\\").."\"") end
f,e = openfile( file, "w+" )
if f then
write(f,string)
closefile(f)
return 2
else
return 0
end
end
end

Đây bác, em quên mất =))

tranvanlong789
10-11-19, 09:51 PM
BÁC CÓ BỘ NÀO BẢNG XẾP HẠNG TOÀN SEVER THEO DẠNG SÉT TINH LỰC HOẶC SETTASK KHÔNG ? SHARE CHO EM XIN VỚI BÁC.

BỘ NÀO MÀ NÓ CHẠY ĐƯỢC TOÀN BỘ SEVER ẤY. ĐỪNG TÍNH THEO GS. CHỨ NHƯ CÁI SCRIPT vng_top nó tính theo GS.

qd3097
10-11-19, 11:16 PM
function TaoBang(tTable, sTableName, sTab)
sTab = sTab or "";
sTmp = ""
sTmp = sTmp..sTab..sTableName.."={"

local tStart = 0
for key, value in tTable do

if tStart == 1 then
sTmp = sTmp..",\r\n"

else
sTmp = sTmp.."\r\n"
tStart = 1
end
local sKey = (type(key) == "string") and format("[%q]",key) or format("[%d]",key);
if(type(value) == "table") then
sTmp = sTmp..TaoBang(value, sKey, sTab.."\t");
else
local sValue = (type(value) == "string") and format("%q",value) or tostring(value);
sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
end

end
sTmp = sTmp.."\r\n"..sTab.."}"
--Msg2Player(sTmp)
return sTmp

end
function SaveData(file, string)
local f,e = openfile( file, "w+" )
if f then
write(f,string)
closefile(f)
return 1
else
local _,_,path = strfind(file, "(.+[/_\\]).+$")
if path ~= nil then execute("mkdir ".."\""..gsub(path, "/", "\\").."\"") end
f,e = openfile( file, "w+" )
if f then
write(f,string)
closefile(f)
return 2
else
return 0
end
end
end

Đây bác, em quên mất =))

Cảm ơn bác nhiều nhiều nhiều nhé :)>-

f-fantasy
11-11-19, 06:25 PM
BÁC CÓ BỘ NÀO BẢNG XẾP HẠNG TOÀN SEVER THEO DẠNG SÉT TINH LỰC HOẶC SETTASK KHÔNG ? SHARE CHO EM XIN VỚI BÁC.

BỘ NÀO MÀ NÓ CHẠY ĐƯỢC TOÀN BỘ SEVER ẤY. ĐỪNG TÍNH THEO GS. CHỨ NHƯ CÁI SCRIPT vng_top nó tính theo GS.

Thú thực với bác em chỉ chơi off nên hoàn toàn ko nghiên cứu vụ xếp hạng

cuongvh93
24-02-20, 03:03 PM
BÁC CÓ BỘ NÀO BẢNG XẾP HẠNG TOÀN SEVER THEO DẠNG SÉT TINH LỰC HOẶC SETTASK KHÔNG ? SHARE CHO EM XIN VỚI BÁC.

BỘ NÀO MÀ NÓ CHẠY ĐƯỢC TOÀN BỘ SEVER ẤY. ĐỪNG TÍNH THEO GS. CHỨ NHƯ CÁI SCRIPT vng_top nó tính theo GS.

Cái này do chạy nhiều GS nên bị vậy đúng k bác? k biết bác fix đc chưa. Hôm bữa e fix đc vấn đề này rồi. e đang chạy 8GS luôn.

laptrinhjx
24-02-20, 04:27 PM
cho mình ké 1 tí, ai còn giữ ui thu phí cho xin với

vta10306
09-10-20, 10:10 PM
- Vẫn câu quen thuộc : Phục vụ chơi off tự sung sướng nhé.
- Vì chơi off nên có khá nhiều vấn đề sung sứong. Đơn cử như việc sẽ setup để làm sao điểm kinh nghiệm đạt được nhiều nhiều. Mà cắm chuột nó lên kịch 200 rồi nó phí hê hê. Cho nên mình nghĩ tới việc lưu lại điểm kinh nghiệm ra 1 file nào đó để xài dần.
- Điểm kinh nghiệm được lưu theo dạng tạo bảng lưu vào 1 file LUA chứ không dùng TASK hay PARAM cho nên bạn lưu vài trăm triệu ngàn tỷ điểm cũng được.
- Vì điểm kinh nghiệm được lưu nên bạn hoàn toàn có thể TRADE giao dịch với các nhân vật khác. Vui hầy.
Bước 1: Tạo 1 "Thư Viện" hàm.
- Tạo 1 file mới đặt tên funclib.lua (Để ở đâu trong thư mục script của bạn thì tuỳ)
- Mình sẽ viết các câu lệnh ví dụ như SaveExp, GetSaveExp, NewSaveExp.......Để các file khác sẽ Include đến file funclib.lua này mà sử dụng.
- Tại sao nên tạo funclib.lua.

Chắc các bạn quen với những câu hàm như GetLevel(), GetCash(), GetName() rồi đúng không, các câu lệnh này thường xuyên được sử dụng. Nó có sẵn trong thư viện hàm của server rồi.
Nếu bạn không tạo 1 "thư viện" thì mỗi lần muốn sử dụng hàm GetSaveExp() (Kiểm tra số điểm kinh nghiệm đã lưu lại) bạn lại phải viết lại (Định nghĩa lại) cả hàm thì nó mới hiểu. Và như vậy thì cực kỳ dài dòng rối rắm
Vậy hãy định nghĩa nó 1 lần vào funclib.lua xong mỗi lần muốn dùng hàm ở 1 file LUA khác hãy Include đến funclib.lua và dùng hàm gọn gàng đơn giản khỏi viết lại cả 1 đoạn dài.

- Các hàm cần tạo mới
Hàm Kiểm Tra

CheckSaveExp() : Kiểm tra xem nhân vật đang sử dụng đã từng lưu điểm kinh nghiệm chưa, nếu chưa từng lưu thì hàm trả về NIL
GetSaveExp() : Kiểm tra xem nhân vật đã lưu bao nhiêu điểm kinh nghiệm

Hàm Lưu Kinh Nghiệm Vào

PlayerSaveExp() : Hàm này sẽ rút hết điểm kinh nghiệm trên người nhân vật lưu vào dữ liệu. Mình không viết code đoạn nếu điểm kinh nghiệm trên người đang ÂM vì mình chơi 1 mình chả đánh nhau với ai, còn nếu bạn có nhu cầu thì bạn tự xử nhé
NewSaveExp() : Hàm sẽ tạo 1 data mới dành cho những nhân vật chưa từng lưu điểm kinh nghiệm bao giờ
AddSaveExp(nCount) : Lưu nCount điểm kinh nghiệm vào dữ liệu. Hàm này có thể dùng khi bạn ăn event chẳng hạn. Không muốn điểm ngấm vào nhân vật mà lưu luôn vào data thì sử dụng hàm này. Ví dụ ăn cái bánh event được 5.000.000 KN thì dùng AddSaveExp(5000000)

Hàm Lấy Kinh Nghiệm Ra

PaySaveExp(nCount) : Trừ đi nCount điểm kinh nghiệm có trong dữ liệu. Khi rút ra 5.000.000 ăn vào nhân vật thì phải trừ đi 5.000.000 trong dữ liệu (hay dễ hiểu là trong TÀI KHOẢN). Thực ra bạn có thể sử dụng chính hàm AddSaveExp với số điểm cần add là số âm cũng được. Nhưng tính mình thích rành rot rõ ràng nên tạo luôn 1 hàm trừ.
EarnSaveExp(nCount) : Lấy nCount điểm kinh nghiệm trong TÀI KHOẢN cộng vào nhân vật và trừ đi nCount điểm trong TÀI KHOẢN

- Các bạn có thể thắc mắc bản thân game có hàm AddOwnExp tại sao phải cho thêm cái hàm EarnSaveExp để cộng điểm kinh nghiệm vào nhân vật.

Mình tạo hàm Pay để trừ điểm có trong TÀI KHOẢN. Và muốn kết hợp với hàm EARN trong trường hợp muốn cộng điểm vào chính nhân vật. Tức là khi sử dụng EARN nó sẽ tự động trừ đi thông qua hàm PAY
Vậy trường hợp GIAO DỊCH điểm kinh nghiệm? Lúc này chỉ trừ điểm có trong TÀI KHOẢN (Chỉ dùng hàm PAY) mà lại không cộng nó vào nhân vật. Nó chuyển số điểm đó sang TÀI KHOẢN của nhân vật khác.

Hàm đọc số có nhiều chữ số

ShowBigNumber : Bạn lưu 1 tỷ điểm kinh nghiệm vào và nếu không tạo 1 cái hàm đọc con số 1 tỷ này cho rành rọt thì toặc máu mắt ngồi đếm SỐ CHỮ SỐ.
Ví dụ bạn lưu 1.945.200.100 điểm thì khi sử dụng hàm này nó sẽ đọc thành dạng 1 Tỷ 945 Triệu 200 Nghìn 100 Điểm Kinh Nghiệm. Tiện hơn cho bạn dùng với Msg2Player hiện thông báo cho người chơi thấy


Bước 2 : Tạo 1 file lưu TÀI KHOẢN
- Tạo 1 file expdata.lua để ở đâu là tùy bạn (Lát trong code chỉ đường dẫn đúng tới nó là OK)
Nội dung file

ExpData={

}
Bước 3: Các code trong Funclib.lua
- Trước hết nó cần Include file Include("\\script\\00ff\\data\\expdata.lua")
- Hàm CheckSaveExp()

function CheckSaveExp()
---Hµm nµy sÏ kiÓm tra xem nh©n vËt ®· tơng că d÷ liÖu luu KN hay ch­a
for i=1,getn(ExpData) do
if GetUUID() == ExpData[i][2] then
return i
end
end
--NƠu ch­a tơng l­u th× gi¸ tr̃ tr¶ v̉ lµ NIL cßn ®· tơng l­u th× gi¸ tr̃ tr¶ v̉ chƯnh lµ ṽ trƯ ®· l­u trong b¶ng ExpData
end
- Hàm GetSaveExp()

function GetSaveExp()
return ExpData[CheckSaveExp()][3]
end
- Hàm PlayerSaveExp

function PlayerSaveExp()
--Hµm l­u toµn bé Exp trªn ng­êi.
local ExpPlayer = GetExp() --Exp ®ang co trªn ng­êi
local TongExpNew = ExpPlayer + ExpData[CheckSaveExp()][3]
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(ExpPlayer,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(ExpData[CheckSaveExp()][3],2).." ®iÓm kinh nghiÖm.")
ReduceOwnExp(ExpPlayer) --Xo¸ hªt exp trªn ng­êi
end
-Hàm NewSaveExp

function NewSaveExp() --T¹o data míi cho nh©n vËt ch­a CS bao giê
if CheckSaveExp() == nil then --Nh©n vËt ch­a tơng l­u
local Vitri = getn(ExpData)+1
ExpData[Vitri] = {}
ExpData[Vitri][1] = GetName()
ExpData[Vitri][2] = GetUUID()
ExpData[Vitri][3] = 0
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
end
end
- Hàm AddSaveExp

function AddSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm AddSaveExp kh«ng x¸c ®̃nh")
end
local TongExpNew = nCount + GetSaveExp()
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(nCount,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(GetSaveExp(),2)..".")
end
- Hàm PaySaveExp(nCount)

function PaySaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm PaySaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
local TongExpNew = GetSaveExp() - nCount
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Rót ra "..ShowBigNumber(nCount,2)..".")
Msg2Player("Cßn l¹i "..ShowBigNumber(GetSaveExp(),2)..".")
end
- Hàm EarnSaveExp(nCount)

function EarnSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm EarnSaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
AddOwnExp(nCount)
PaySaveExp(nCount)
Msg2Player("Céng "..ShowBigNumber(nCount,2).." vµo nh©n vËt.")
end
- Hàm ShowBigNumber
Hàm này mình viết cũng lâu rồi, nó đọc cả số TIỀN và ĐIỂM KN. Mình lười xóa cái đoạn đọc tiền đi nên để nguyên nhé
Cách dùng
ShowBigNumber(10000,1) --Nó sẽ đọc là 1 Vạn
ShowBigNumber(10000,2) --Nó sẽ đọc là 10 nghìn

function ShowBigNumber(Value,Type)
local NumberString = tostring(Value)
local DoDai = strlen(NumberString)
if Type == 0 or Type == nil then
return "Kh«ng x¸c ®̃nh"
end
if Type == 1 then --§äc sè tỉn
if DoDai <= 4 then
return "<color=yellow>"..NumberString.."<color> l­îng"
elseif DoDai > 4 and DoDai <= 8 then--Tơ 1.0000 ®Ơn 9999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 4)
local nY = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> v¹n <color=yellow>"..nY.."<color> l­îng"
elseif DoDai > 8 and DoDai <=10 then --Tơ 10.000.0000 ®Ơn 999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 7)
local nY = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nZ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> v¹n <color=yellow>"..nZ.."<color> l­îng"
elseif DoDai > 10 and DoDai <= 13 then--Tơ 1.000.000.0000 v¹n 999.999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 10)
local nY = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nZ = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
elseif DoDai > 13 then
local nX = strsub(tostring(Value),1,DoDai - 13)
local nY = strsub(tostring(Value),DoDai - 12,DoDai - 10)
local nZ = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nI = strsub(tostring(Value),DoDai - 6,DoDai-4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nI.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
end
elseif Type == 2 then --§äc sè ®iÓm kinh nghiÖm
if DoDai <= 3 then
return "<color=yellow>"..NumberString.."<color> kinh nghiÖm"
elseif DoDai > 3 and DoDai <= 6 then--Tơ 1000 ®Ơn 999.999
local nX = strsub(tostring(Value),1,DoDai - 3)
local nY = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> kinh nghiÖm"
elseif DoDai > 6 and DoDai <=9 then --Tơ 1.000.000 ®Ơn 999.999.999
local nX = strsub(tostring(Value),1,DoDai - 6)
local nY = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nZ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> kinh nghiÖm"
--elseif DoDai > 9 and DoDai <= 12 then--Tơ 1.000.000.000 ®Ơn 999.999.999.999 1 tû ®Ơn 999 tû
elseif DoDai > 9 then--Tơ 1.000.000.000
local nX = strsub(tostring(Value),1,DoDai - 9)
local nY = strsub(tostring(Value),DoDai - 8,DoDai - 6)
local nZ = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nJ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nJ.."<color> kinh nghiÖm"
end
end

end
Bước 4 : Thiết lập mỗi khi đăng nhập sẽ check xem nhân vật có TÀI KHOẢN chưa, chưa có thì add TÀI KHOẢN tự động
- Mở \jxser\server1\script\global\login_head.lua

- Thêm đoạn này vào AddLoginFileFunction("\\script\\00ff\\funclib.lua","NewSaveExp") cuối cùng của file
- Vậy là nhân vật mới tạo mới, hoặc login vào game là nó sẽ auto chạy cái hàm NewSaveExp() mình viết ở trên.
- Vì đã làm bước 4 này thì tất cả các nhân vật của bạn từ lúc tạo mới login vào game là lập tức được tạo TÀI KHOẢN, cho nên các hàm trong THƯ VIỆN bên trên mình không hề cho CHECK xem đã có tài khoản hay chưa. Vì chắc chắn đã có

Toàn bộ file funclib.lua

Include("\\script\\00ff\\data\\expdata.lua")
function CheckSaveExp()
---Hµm nµy sÏ kiÓm tra xem nh©n vËt ®· tơng că d÷ liÖu luu KN hay ch­a
for i=1,getn(ExpData) do
if GetUUID() == ExpData[i][2] then
return i
end
end
--NƠu ch­a tơng l­u th× gi¸ tr̃ tr¶ v̉ lµ NIL cßn ®· tơng l­u th× gi¸ tr̃ tr¶ v̉ chƯnh lµ ṽ trƯ ®· l­u trong b¶ng ExpData
end
function GetSaveExp()
return ExpData[CheckSaveExp()][3]
end
function AddSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm AddSaveExp kh«ng x¸c ®̃nh")
end
local TongExpNew = nCount + GetSaveExp()
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(nCount,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(GetSaveExp(),2)..".")
end
function PaySaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm PaySaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
local TongExpNew = GetSaveExp() - nCount
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Rót ra "..ShowBigNumber(nCount,2)..".")
Msg2Player("Cßn l¹i "..ShowBigNumber(GetSaveExp(),2)..".")
end
function EarnSaveExp(nCount)
if nCount == nil then
return Msg2Player("Hµm EarnSaveExp kh«ng x¸c ®̃nh")
end
if nCount > GetSaveExp() then
return Msg2Player("§iÓm kinh nghiÖm ®· l­u kh«ng ®ñ.")
end
AddOwnExp(nCount)
PaySaveExp(nCount)
Msg2Player("Céng "..ShowBigNumber(nCount,2).." vµo nh©n vËt.")
end
function SaveExpPlayer()
--Hµm l­u toµn bé Exp trªn ng­êi.
local ExpPlayer = GetExp() --Exp ®ang co trªn ng­êi
local TongExpNew = ExpPlayer + ExpData[CheckSaveExp()][3]
ExpData[CheckSaveExp()][3] = TongExpNew
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
Msg2Player("Thªm "..ShowBigNumber(ExpPlayer,2).." vµo.")
Msg2Player("HiÖn că "..ShowBigNumber(ExpData[CheckSaveExp()][3],2).." ®iÓm kinh nghiÖm.")
ReduceOwnExp(ExpPlayer) --Xo¸ hªt exp trªn ng­êi
end
function NewSaveExp() --T¹o data míi cho nh©n vËt ch­a CS bao giê
if CheckSaveExp() == nil then --Nh©n vËt ch­a tơng l­u
local Vitri = getn(ExpData)+1
ExpData[Vitri] = {}
ExpData[Vitri][1] = GetName()
ExpData[Vitri][2] = GetUUID()
ExpData[Vitri][3] = 0
local Data = TaoBang(ExpData,"ExpData","")
SaveData("script/00ff/data/expdata.lua",Data)
end
end
function ShowBigNumber(Value,Type)
local NumberString = tostring(Value)
local DoDai = strlen(NumberString)
if Type == 0 or Type == nil then
return "Kh«ng x¸c ®̃nh"
end
if Type == 1 then --§äc sè tỉn
if DoDai <= 4 then
return "<color=yellow>"..NumberString.."<color> l­îng"
elseif DoDai > 4 and DoDai <= 8 then--Tơ 1.0000 ®Ơn 9999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 4)
local nY = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> v¹n <color=yellow>"..nY.."<color> l­îng"
elseif DoDai > 8 and DoDai <=10 then --Tơ 10.000.0000 ®Ơn 999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 7)
local nY = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nZ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> v¹n <color=yellow>"..nZ.."<color> l­îng"
elseif DoDai > 10 and DoDai <= 13 then--Tơ 1.000.000.0000 v¹n 999.999.999.9999 v¹n
local nX = strsub(tostring(Value),1,DoDai - 10)
local nY = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nZ = strsub(tostring(Value),DoDai - 6,DoDai - 4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
elseif DoDai > 13 then
local nX = strsub(tostring(Value),1,DoDai - 13)
local nY = strsub(tostring(Value),DoDai - 12,DoDai - 10)
local nZ = strsub(tostring(Value),DoDai - 9,DoDai - 7)
local nI = strsub(tostring(Value),DoDai - 6,DoDai-4)
local nJ = strsub(tostring(Value),DoDai - 3,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nI.."<color> v¹n <color=yellow>"..nJ.."<color> l­îng"
end
elseif Type == 2 then --§äc sè ®iÓm kinh nghiÖm
if DoDai <= 3 then
return "<color=yellow>"..NumberString.."<color> kinh nghiÖm"
elseif DoDai > 3 and DoDai <= 6 then--Tơ 1000 ®Ơn 999.999
local nX = strsub(tostring(Value),1,DoDai - 3)
local nY = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> ngh×n <color=yellow>"..nY.."<color> kinh nghiÖm"
elseif DoDai > 6 and DoDai <=9 then --Tơ 1.000.000 ®Ơn 999.999.999
local nX = strsub(tostring(Value),1,DoDai - 6)
local nY = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nZ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> triÖu <color=yellow>"..nY.."<color> ngh×n <color=yellow>"..nZ.."<color> kinh nghiÖm"
--elseif DoDai > 9 and DoDai <= 12 then--Tơ 1.000.000.000 ®Ơn 999.999.999.999 1 tû ®Ơn 999 tû
elseif DoDai > 9 then--Tơ 1.000.000.000
local nX = strsub(tostring(Value),1,DoDai - 9)
local nY = strsub(tostring(Value),DoDai - 8,DoDai - 6)
local nZ = strsub(tostring(Value),DoDai - 5,DoDai - 3)
local nJ = strsub(tostring(Value),DoDai - 2,DoDai)
return "<color=yellow>"..nX.."<color> tû <color=yellow>"..nY.."<color> triÖu <color=yellow>"..nZ.."<color> ngh×n <color=yellow>"..nJ.."<color> kinh nghiÖm"
end
end

end

CHÚ Ý
- Tất cả Code ở trên nếu bạn thấy có nào có đường dẫn thì phải thay lại thành đường dẫn của bạn cho phù hợp.
- Mình không nói kỹ về vấn đề TRADE điểm KN vì các hàm cơ bản đã có. Bạn có thể dùng hàm GetUUID() Có sẵn của server để tìm ra chính xác vị trí lưu điểm kinh nghiệm của nhân vật rồi TRADE với nhau.
- Tương tự các bạn có thể viết hàm LƯU TIỀN, LƯU ITEM. Cũng là 2 vấn đề của anh em chơi tự sướng. Tiền rớt quá nhiều mà mỗi nhân vật được cất hòm có 200k vạn thì phải là max. Vậy thì SAVE nó lại.
- Lưu ITEM thì khó khăn hơn vì nó có nhiều thông số.
- Hệ thống mới coi như hình thành. Khi các bạn cần sử dụng các hàm mới thì nhớ Include file funclib.lua vào là được
- Chúc các bạn quay tay sung sướng những ngày hè oi ả
Video demo : <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>
Pic : Cắm 4 con trên map Bãi Luyện Công (Được tạo thêm) 2 hay 3 ngày hôm nay rồi. Với hệ thống save item, save money, save exp, và sửa đồ
<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> (<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>)

xin đào chủ đề này, sau khi chép toàn bộ vào file, gán cript cho vật phẩm mới, nhấp vào vật phẩm không được, ffantasy cho hỏi là lỗi gì? cái code toàn bộ cript phải viết thêm , chèn thêm cái gì? ( mình là người mới, chỉ biết copy paste thôi :))

f-fantasy
19-11-20, 08:12 PM
xin đào chủ đề này, sau khi chép toàn bộ vào file, gán cript cho vật phẩm mới, nhấp vào vật phẩm không được, ffantasy cho hỏi là lỗi gì? cái code toàn bộ cript phải viết thêm , chèn thêm cái gì? ( mình là người mới, chỉ biết copy paste thôi :))

Bác mới thì kể ra cũng khó ạ. Nhấp vào vật phẩm không có hiện tượng gì hay bên phần server nó có báo lỗi scritp gì không bác?