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 cha
for i=1,getn(ExpData) do
if GetUUID() == ExpData[i][2] then
return i
end
end
--NƠu cha tơng lu th× gi¸ tr̃ tr¶ v̉ lµ NIL cßn ®· tơng lu th× gi¸ tr̃ tr¶ v̉ chƯnh lµ ṽ trƯ ®· lu trong b¶ng ExpData
end
- Hàm GetSaveExp()
function GetSaveExp()
return ExpData[CheckSaveExp()][3]
end
- Hàm PlayerSaveExp
function PlayerSaveExp()
--Hµm lu 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 cha CS bao giê
if CheckSaveExp() == nil then --Nh©n vËt cha tơng lu
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 ®· lu 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 ®· lu 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 cha
for i=1,getn(ExpData) do
if GetUUID() == ExpData[i][2] then
return i
end
end
--NƠu cha tơng lu th× gi¸ tr̃ tr¶ v̉ lµ NIL cßn ®· tơng lu th× gi¸ tr̃ tr¶ v̉ chƯnh lµ ṽ trƯ ®· lu 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 ®· lu 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 ®· lu kh«ng ®ñ.")
end
AddOwnExp(nCount)
PaySaveExp(nCount)
Msg2Player("Céng "..ShowBigNumber(nCount,2).." vµo nh©n vËt.")
end
function SaveExpPlayer()
--Hµm lu 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 cha CS bao giê
if CheckSaveExp() == nil then --Nh©n vËt cha tơng lu
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>
- 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 cha
for i=1,getn(ExpData) do
if GetUUID() == ExpData[i][2] then
return i
end
end
--NƠu cha tơng lu th× gi¸ tr̃ tr¶ v̉ lµ NIL cßn ®· tơng lu th× gi¸ tr̃ tr¶ v̉ chƯnh lµ ṽ trƯ ®· lu trong b¶ng ExpData
end
- Hàm GetSaveExp()
function GetSaveExp()
return ExpData[CheckSaveExp()][3]
end
- Hàm PlayerSaveExp
function PlayerSaveExp()
--Hµm lu 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 cha CS bao giê
if CheckSaveExp() == nil then --Nh©n vËt cha tơng lu
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 ®· lu 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 ®· lu 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 cha
for i=1,getn(ExpData) do
if GetUUID() == ExpData[i][2] then
return i
end
end
--NƠu cha tơng lu th× gi¸ tr̃ tr¶ v̉ lµ NIL cßn ®· tơng lu th× gi¸ tr̃ tr¶ v̉ chƯnh lµ ṽ trƯ ®· lu 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 ®· lu 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 ®· lu kh«ng ®ñ.")
end
AddOwnExp(nCount)
PaySaveExp(nCount)
Msg2Player("Céng "..ShowBigNumber(nCount,2).." vµo nh©n vËt.")
end
function SaveExpPlayer()
--Hµm lu 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 cha CS bao giê
if CheckSaveExp() == nil then --Nh©n vËt cha tơng lu
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>