[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
Follow us on
Follow us on Facebook Follow us on Twitter Linked In Flickr Watch us on YouTube My Space Blogger
 
Kết quả 1 đến 10 của 10
  1. #1
    Thành Viên
    Ngày tham gia
    Jun 2006
    Đang ở
    Funabashi, Chiba, Japan
    Bài viết
    544
    Thanks
    410
    Thanked 300 Times in 82 Posts

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

    - 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
    Code:
    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()
    Code:
    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()
    Code:
    function GetSaveExp()
    	return ExpData[CheckSaveExp()][3]
    end
    - Hàm PlayerSaveExp
    Code:
    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
    Code:
    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
    Code:
    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)
    Code:
    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)
    Code:
    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
    Code:
    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
    Code:
    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 : [Only registered and activated users can see links. ]
    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 đồ
    [Only registered and activated users can see links. ]
    Lần sửa cuối bởi f-fantasy, ngày 11-06-19 lúc 08:12 PM.
    Khách viếng thăm hãy cùng f-fantasy xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  2. The Following 17 Users Say Thank You to f-fantasy For This Useful Post:

    Anh2SiTinh (10-06-19), Bull_Shit (11-06-19), caunho1x9x (04-11-19), duynguyenjx (04-11-19), ehwgagc987 (10-06-19), hoang958 (10-06-19), keo_ngot1418 (28-08-19), KhongGianOL (10-06-19), qd3097 (02-11-19), thinhba (11-06-19), thtrungtinh (13-06-19), tranvanlong789 (19-06-19), trilap2004 (10-06-19), vlxx1 (27-11-20), vta10306 (09-10-20), vuduymanh (10-06-19), __Jie__ (11-06-19)

  3. #2
    Thành Viên
    Ngày tham gia
    Aug 2015
    Bài viết
    6
    Thanks
    4
    Thanked 2 Times in 1 Post

    Icon5 Ðề: LINUX - Tạo 1 hệ thống Lưu điểm kinh nghiệm, giao dịch điểm KN - Off tự sướn

    Trích dẫn Gửi bởi f-fantasy [Only registered and activated users can see links. ]
    - 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
    Code:
    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()
    Code:
    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()
    Code:
    function GetSaveExp()
    	return ExpData[CheckSaveExp()][3]
    end
    - Hàm PlayerSaveExp
    Code:
    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
    Code:
    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
    Code:
    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)
    Code:
    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)
    Code:
    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
    Code:
    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
    Code:
    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 : [Only registered and activated users can see links. ]
    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 đồ
    [Only registered and activated users can see links. ]
    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
    Khách viếng thăm hãy cùng qd3097 xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  4. The Following 2 Users Say Thank You to qd3097 For This Useful Post:

    duynguyenjx (04-11-19), hungvoi94 (04-11-19)

  5. #3
    Thành Viên
    Ngày tham gia
    Jun 2006
    Đang ở
    Funabashi, Chiba, Japan
    Bài viết
    544
    Thanks
    410
    Thanked 300 Times in 82 Posts

    Ðề: LINUX - Tạo 1 hệ thống Lưu điểm kinh nghiệm, giao dịch điểm KN - Off tự sướn

    Trích dẫn Gửi bởi qd3097 [Only registered and activated users can see links. ]
    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
    Code:
    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
    Khách viếng thăm hãy cùng f-fantasy xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  6. Các thành viên gởi lời cảm ơn đến f-fantasy vì bài viết này !

    qd3097 (10-11-19)

  7. #4
    Thành Viên
    Ngày tham gia
    Feb 2016
    Bài viết
    225
    Thanks
    24
    Thanked 4 Times in 4 Posts

    Ðề: LINUX - Tạo 1 hệ thống Lưu điểm kinh nghiệm, giao dịch điểm KN - Off tự sướn

    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.
    Khách viếng thăm hãy cùng tranvanlong789 xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  8. #5
    Thành Viên
    Ngày tham gia
    Aug 2015
    Bài viết
    6
    Thanks
    4
    Thanked 2 Times in 1 Post

    Icon14 Ðề: LINUX - Tạo 1 hệ thống Lưu điểm kinh nghiệm, giao dịch điểm KN - Off tự sướn

    Trích dẫn Gửi bởi f-fantasy [Only registered and activated users can see links. ]
    Code:
    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é
    Khách viếng thăm hãy cùng qd3097 xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  9. #6
    Thành Viên
    Ngày tham gia
    Jun 2006
    Đang ở
    Funabashi, Chiba, Japan
    Bài viết
    544
    Thanks
    410
    Thanked 300 Times in 82 Posts

    Ðề: LINUX - Tạo 1 hệ thống Lưu điểm kinh nghiệm, giao dịch điểm KN - Off tự sướn

    Trích dẫn Gửi bởi tranvanlong789 [Only registered and activated users can see links. ]
    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
    Khách viếng thăm hãy cùng f-fantasy xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  10. #7
    Thành Viên cuongvh93's Avatar
    Ngày tham gia
    Aug 2015
    Đang ở
    Thiếu Lâm Phái
    Bài viết
    589
    Thanks
    72
    Thanked 453 Times in 183 Posts

    Ðề: LINUX - Tạo 1 hệ thống Lưu điểm kinh nghiệm, giao dịch điểm KN - Off tự sướn

    Trích dẫn Gửi bởi tranvanlong789 [Only registered and activated users can see links. ]
    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.
    Khách viếng thăm hãy cùng cuongvh93 xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  11. #8
    Thành Viên
    Ngày tham gia
    Feb 2016
    Bài viết
    152
    Thanks
    49
    Thanked 14 Times in 10 Posts

    Ðề: LINUX - Tạo 1 hệ thống Lưu điểm kinh nghiệm, giao dịch điểm KN - Off tự sướn

    cho mình ké 1 tí, ai còn giữ ui thu phí cho xin với
    Khách viếng thăm hãy cùng laptrinhjx xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  12. #9
    Thành Viên
    Ngày tham gia
    Dec 2008
    Bài viết
    11
    Thanks
    5
    Thanked 0 Times in 0 Posts

    Ðề: LINUX - Tạo 1 hệ thống Lưu điểm kinh nghiệm, giao dịch điểm KN - Off tự sướn

    Trích dẫn Gửi bởi f-fantasy [Only registered and activated users can see links. ]
    - 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
    Code:
    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()
    Code:
    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()
    Code:
    function GetSaveExp()
        return ExpData[CheckSaveExp()][3]
    end
    - Hàm PlayerSaveExp
    Code:
    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
    Code:
    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
    Code:
    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)
    Code:
    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)
    Code:
    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
    Code:
    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
    Code:
    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 : [Only registered and activated users can see links. ]
    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 đồ
    [Only registered and activated users can see links. ]
    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
    Khách viếng thăm hãy cùng vta10306 xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  13. #10
    Thành Viên
    Ngày tham gia
    Jun 2006
    Đang ở
    Funabashi, Chiba, Japan
    Bài viết
    544
    Thanks
    410
    Thanked 300 Times in 82 Posts

    Ðề: LINUX - Tạo 1 hệ thống Lưu điểm kinh nghiệm, giao dịch điểm KN - Off tự sướn

    Trích dẫn Gửi bởi vta10306 [Only registered and activated users can see links. ]
    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?
    Khách viếng thăm hãy cùng f-fantasy xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

 

 

Các Chủ đề tương tự

  1. [KT] Xin file setting kinh nghiệm lên cấp và kinh nghiệm đánh quái như VNG
    Bởi helpme85 trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 3
    Bài viết cuối: 17-11-16, 07:22 PM
  2. [KT] Lỗi không cho sách kinh nghiệm đồng hành vào để tăng kinh nghiệm chân nguyên
    Bởi Kyo Công Tử trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 2
    Bài viết cuối: 20-09-14, 06:41 AM
  3. Chỉnh nhân kinh nghiệm và chỉnh kinh nghiệm phụ bản
    Bởi Nike3692 trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 1
    Bài viết cuối: 27-05-14, 03:48 AM
  4. Sever sro-teenviet nơi các mem giao lưu, trao đổi kinh nghiệm, GM nhiet tinh
    Bởi trungkientk89 trong diễn đàn CÁC SERVER GAME PRIVATE ONLINE
    Trả lời: 1
    Bài viết cuối: 20-03-14, 01:48 PM

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •  
Múi giờ GMT +7. Bây giờ là 10:31 PM.
vBulletin®, Copyright ©2000-2011, Jelsoft Enterprises Ltd.
CLBGamesVN không chịu trách nhiệm về Luật Bản Quyền của các tài liệu, bài viết v.v...được đăng tải trên diễn đàn này.
Diễn đàn phát triển dưới sự đóng góp của tất cả thành viên. BQT chỉ là những người thành lập ra sân chơi, quản lý và duy trì về mặt kỹ thuật, nội dung khi hợp lệ.