PDA

View Full Version : [KT] Code mở item ra số tiền ngẫu nhiên



nnquyen309
12-05-24, 02:38 PM
Em tạo 1 item mới Túi Tiền Du Long, viết script cho nó mở ra random số tiền trong list là 10 ,20, 50, 100, 200. (dựa theo code của rương BVD)

Mở túi thì script chạy đúng random số tiền, nhưng LỖI là sau khi chuột phải mở thì cái túi không mất đi, nó cứ nằm nguyên đó và click phải sẽ mở tiếp vô tận :(


local tbTuiTDL = Item:GetClass("tuitiendulong");

function tbTuiTDL:OnUse()

if me.CountFreeBagCell() < 1 then
me.Msg("Túi của bạn đã đầy, cần ít nhất 1 ô trống.");
return 0;
end

local i = 0;
local nAdd = 0;
local nRand = 0;
local nIndex = 1;

-- random
nRand = MathRandom(1, 1000);

-- fill 3 rate
local tbRate = {500, 300, 140, 50, 10};
local tbAward = {10 ,20, 50, 100, 200};

-- get index
for i = 1, 5 do
nAdd = nAdd + tbRate[i];
if nAdd >= nRand then
nIndex = i;
break;
end
end
--local pItem = me.AddItem(18, 1, 1, tbAward[nIndex]);
local pItem = me.AddStackItem(18,1,553,1,nil,tbAward[nIndex]);
pItem.Bind(1);

me.Msg("Bạn nhận được <color=yellow>"..pItem.szName.."<color>");

return 0;
end


Em đang nghi ngờ do vòng lặp for, xin nhờ các anh hướng dẫn giúp ạ.

__Jie__
12-05-24, 09:10 PM
return 1 thay vì return 0

bạn thử lại nhé

satthupro95
14-05-24, 01:47 PM
local pItem = me.AddStackItem(18,1,553,1,nil,tbAward[nIndex]);
pItem.Bind(1);

Lỗi ngay từ đoạn này rồi bạn, pItem chỉ sử dụng đối với me.AddItem. AddStackItem chỉ trả về số lượng vật phẩm được add

Đầu tiên phải kiểm tra xem hàm rand có ra kết quả không rồi mới thực thi hàm dưới:

if not tbAward[nIndex] then
-- Không có dữ liệu hàm random
return;
end

local tbInfoItem = {18,1,553,1};
local nBindType = 0; -- 0: không khóa, 1: khóa
local nCount = tbAward[nIndex];
me.AddStackItem(tbInfoItem[1], tbInfoItem[2], tbInfoItem[3], tbInfoItem[4], {bForceBind=nBindType,}, nCount);

Đoạn cuối phần return 0 muốn check số lượng và xóa đổi sang:

if it.nCount > 1 then
it.SetCount(it.nCount-1);
else
me.DelItem(it);
end

nnquyen309
15-05-24, 02:20 AM
return 1 thay vì return 0

bạn thử lại nhé

Dạ em có đổi thử thành return 1 mà chưa được anh ạ.

--- Chế độ gộp bài viết ---


Lỗi ngay từ đoạn này rồi bạn, pItem chỉ sử dụng đối với me.AddItem. AddStackItem chỉ trả về số lượng vật phẩm được add

Đầu tiên phải kiểm tra xem hàm rand có ra kết quả không rồi mới thực thi hàm dưới:


Đoạn cuối phần return 0 muốn check số lượng và xóa đổi sang:

Cảm ơn anh, để em làm thử xem sao ạ.

nnquyen309
15-05-24, 03:14 AM
Lỗi ngay từ đoạn này rồi bạn, pItem chỉ sử dụng đối với me.AddItem. AddStackItem chỉ trả về số lượng vật phẩm được add

Đầu tiên phải kiểm tra xem hàm rand có ra kết quả không rồi mới thực thi hàm dưới:


Đoạn cuối phần return 0 muốn check số lượng và xóa đổi sang:

Em đã làm thành công theo hướng dẫn của anh ạ !!! Code rất xịn, Cảm ơn anh nhiều.


Nếu tiện xin cho em hỏi thêm về code:



local tbInfoItem = {18,1,553,1};
me.AddStackItem(tbInfoItem[1], tbInfoItem[2], tbInfoItem[3], tbInfoItem[4], {bForceBind=nBindType,}, nCount);

đoạn này phải gán biến riêng tbInfoItem và khai giá trị [1], [2], .... có phải là để cố định giá trị của item sau mỗi lần vòng lặp for nó chạy hay không anh?
Vì sao lại không input trực tiếp ạ: me.AddStackItem(18, 1, 553, 1, {bForceBind=nBindType,}, nCount);


Thêm nữa cho em hỏi đoạn cuối:


if it.nCount > 1 then
it.SetCount(it.nCount-1);
else
me.DelItem(it);
end

it.nCout thì "it" lúc này là sẽ gọi trực tiếp về vật phẩm item mình đang thao tác đúng không anh?

satthupro95
15-05-24, 06:46 PM
Bạn có thể gán thông tin của item trực tiếp cũng được, nhưng làm vậy sau này muốn thay đổi sẽ phải tìm lại để chỉnh phức tạp hơn là khai báo 1 biến, có thể biến đổi chút bạn có thể khai báo nó thành như này:

local tbTuiTDL = Item:GetClass("tuitiendulong");
tbTuiTDL.tbInfoItem = {18,1,553,1};
tbTuiTDL.nBindType = 1; -- 0: Khong khoa, 1: Khoa

Sau này muốn đổi nó thành vật phẩm khác chỉ cần thay đổi chỗ tbTuiTDL.tbInfoItem và nBindType, không phải mò xuống tận phía dưới để đổi

Ở đoạn me.AddStackItem(tbInfoItem[1], tbInfoItem[2], tbInfoItem[3], tbInfoItem[4], {bForceBind=nBindType,}, nCount);
đổi thành me.AddStackItem(self.tbInfoItem[1], self.tbInfoItem[2], self.tbInfoItem[3], self.tbInfoItem[4], {bForceBind = self.nBindType,}, nCount);

it chỉ sử dụng được nếu nó đang thực thi ở function OnUse

nnquyen309
16-05-24, 02:02 AM
Bạn có thể gán thông tin của item trực tiếp cũng được, nhưng làm vậy sau này muốn thay đổi sẽ phải tìm lại để chỉnh phức tạp hơn là khai báo 1 biến, có thể biến đổi chút bạn có thể khai báo nó thành như này:

local tbTuiTDL = Item:GetClass("tuitiendulong");
tbTuiTDL.tbInfoItem = {18,1,553,1};
tbTuiTDL.nBindType = 1; -- 0: Khong khoa, 1: Khoa

Sau này muốn đổi nó thành vật phẩm khác chỉ cần thay đổi chỗ tbTuiTDL.tbInfoItem và nBindType, không phải mò xuống tận phía dưới để đổi

Ở đoạn me.AddStackItem(tbInfoItem[1], tbInfoItem[2], tbInfoItem[3], tbInfoItem[4], {bForceBind=nBindType,}, nCount);
đổi thành me.AddStackItem(self.tbInfoItem[1], self.tbInfoItem[2], self.tbInfoItem[3], self.tbInfoItem[4], {bForceBind = self.nBindType,}, nCount);

it chỉ sử dụng được nếu nó đang thực thi ở function OnUse

Em đã hiểu, cảm ơn anh lần nữa