PDA

View Full Version : [KT] Chia sẻ hàm để làm tính năng Truyền Công



satthupro95
24-04-17, 07:33 PM
Thấy bên server private nào đó có tính năng truyền công khá hay, hôm nay mình sẽ chia sẻ một số hàm để làm tính năng này:

1. Hàm khiến người chơi ngồi xuống

me.CallClientScript({"AutoAi:Sit"});

2. Hàm check có ngồi trên ngựa hay không

local bCheckedMe = me.GetNpc().IsRideHorse();
if bCheckedMe ~= 0 then
Dialog:Say("Cần phải xuống ngựa mới có thể truyền công")
return
end

3. Hàm gửi yêu cầu cho đối phương và confirm hoặc từ chối


function tbItem:OnUse()
local tbMemberList, nMemberCount = me.GetTeamMemberList();
if not tbMemberList or nMemberCount ~= 2 then
Dialog:Say("Cần 2 người tổ đội nhau mới có thể sử dụng tính năng này");
return 0;
end

local pTeamMate = nil;
for _, pMember in pairs(tbMemberList) do
if pMember.szName ~= me.szName then
pTeamMate = pMember;
end
end

local szMsg = string.format("Bạn có chắc chắn muốn truyền công cho <color=green>%s<color> không ?", pTeamMate.szName);
local tbOpt =
{
{"Ta đồng ý", self.OnConfirmQiuhun, self, me.nId, pTeamMate.nId, nItemId},
{"Để ta suy nghĩ lại"},
};
Dialog:Say(szMsg, tbOpt);
end

-- Đồng ý nhận lời truyền công
function tbItem:OnConfirmQiuhun(nSuitorId, nTeamMateId, nItemId)

local pSuitor = KPlayer.GetPlayerObjById(nSuitorId);
local pTeamMate = KPlayer.GetPlayerObjById(nTeamMateId);

if not pSuitor or not pTeamMate then
return 0;
end

local bIsNearby = 0;
local tbPlayerList = KPlayer.GetAroundPlayerList(pSuitor.nId, 15);
if (tbPlayerList) then
for _, pPlayer in ipairs(tbPlayerList) do
if (pPlayer.szName == pTeamMate.szName) then
bIsNearby = 1;
end
end
end
if (0 == bIsNearby) then
pSuitor.Msg("Hai người phải đứng gần nhau mới có thể truyền công")
pTeamMate.Msg("Hai người phải đứng gần nhau mới có thể truyền công")
return
end

local bCheckedSuitor = pSuitor.GetNpc().IsRideHorse();
local bCheckedTeamMate = pTeamMate.GetNpc().IsRideHorse();
if bCheckedSuitor ~= 0 or bCheckedTeamMate ~= 0 then
Dialog:Say("Cả 2 phải xuống ngựa mới có thể truyền công")
return
end

pSuitor.CallClientScript({"AutoAi:Sit"});
pTeamMate.CallClientScript({"AutoAi:Sit"});
-- 只要使用了求婚卡片,不论对方是否� �意都得删除

local szMsg = string.format("<color=green>%s<color> muốn truyền công cho bạn, bạn có đồng ý ?", pSuitor.szName);
local tbOpt =
{
{"Vâng tôi đồng ý", self.OnAcceptQiuhun, self, nSuitorId, nTeamMateId},
{"Tôi từ chối", self.OnRefuseQiuhun, self, nSuitorId, nTeamMateId},
};

Setting:SetGlobalObj(pTeamMate);
Dialog:Say(szMsg, tbOpt);
Setting:RestoreGlobalObj();
end

-- Đồng ý truyền công
function tbItem:OnAcceptQiuhun(nSuitorId, nTeamMateId)

local pSuitor = KPlayer.GetPlayerObjById(nSuitorId);
local pTeamMate = KPlayer.GetPlayerObjById(nTeamMateId);

if not pSuitor or not pTeamMate then
return 0;
end



end

-- Từ chối truyền công
function tbItem:OnRefuseQiuhun(nSuitorId, nTeamMateId)

local pSuitor = KPlayer.GetPlayerObjById(nSuitorId);
local pTeamMate = KPlayer.GetPlayerObjById(nTeamMateId);

if not pSuitor or not pTeamMate then
return 0;
end

Dialog:SendBlackBoardMsg(pSuitor, string.format("Thật đáng tiếc, <color=green>%s<color> không muốn truyền công với ngươi", pTeamMate.szName));
end


Với hàm này các bạn có thể áp dụng tính năng khi chạy làm cho cả 1 map ngồi xuống :v

cyberc
24-04-17, 09:20 PM
tks bác.....................................:D

visaothe123
25-04-17, 01:08 PM
sv nào ấy nhỉ, kaka :)) , cái này mình cũng confix từ thẻ lễ nạp cát ra, giờ đang dev làm trong ui nó mới ngon :) .

devsevergame
25-04-17, 01:53 PM
sv nào ấy nhỉ, kaka :)) , cái này mình cũng confix từ thẻ lễ nạp cát ra, giờ đang dev làm trong ui nó mới ngon :) , đang cần bác shear hàm gởi lệnh từ client đến sv nè :).

satthupro chia sẽ rồi, ông chia sẽ vài cái cho anh em chơi đi, ủm lâu ngày thúi hết giờ

satthupro95
25-04-17, 04:15 PM
sv nào ấy nhỉ, kaka :)) , cái này mình cũng confix từ thẻ lễ nạp cát ra, giờ đang dev làm trong ui nó mới ngon :) .

mình thiên về những thứ đơn giản hơn, chỉ cần dùng 1 item gửi thông báo đến 1 player khác, xác nhận là bay đến (dựa trên lệnh bài triệu hồi gia tộc), dùng ui khá lằng nhằng

dùng ui thì ez thôi, tạo ui, trích xuất list từ 1 mảng, khởi tạo 1 biến chung từ scriptable rồi callserverscript nếu muốn gọi 1 cái gì đó :D

visaothe123
25-04-17, 10:39 PM
mình thiên về những thứ đơn giản hơn, chỉ cần dùng 1 item gửi thông báo đến 1 player khác, xác nhận là bay đến (dựa trên lệnh bài triệu hồi gia tộc), dùng ui khá lằng nhằng

dùng ui thì ez thôi, tạo ui, trích xuất list từ 1 mảng, khởi tạo 1 biến chung từ scriptable rồi callserverscript nếu muốn gọi 1 cái gì đó :D

uh, vì trước giờ k đụng đến ui, giờ đang định vọc ui thử, k biết có dễ ăn k nữa :)). để tạo ui xếp hạng cho máy cái cho hoạt động bang hội :), theo mình thấy nếu dev đc thì 2.6 có thể 9/10 bản linux.

satthupro95
26-04-17, 12:40 PM
uh, vì trước giờ k đụng đến ui, giờ đang định vọc ui thử, k biết có dễ ăn k nữa :)). để tạo ui xếp hạng cho máy cái cho hoạt động bang hội :), theo mình thấy nếu dev đc thì 2.6 có thể 9/10 bản linux.

cứ viết hàm trên sv xử lý hết trên đấy, client chỉ cần callserver là gọi đc ra hết :D

minzkool
29-01-18, 02:37 PM
cho e hỏi
e thêm tính năng truyền công 2 lần/ ngày
mà e tắt server đi hôm sau vào mà nó cứ báo truyền công đã hết mặc dù đã thêm task cho nó

local nStackSuitor = pSuitor.GetTask(2024,24)
if nStackSuitor >= 2 then
Dialog:Say("Truyền công tối đa 2 lần / 1 ngày");
return 0;
end

local nStackTeam = pTeamMate.GetTask(2024,24)
if nStackTeam >= 2 then
Dialog:Say("Người chơi bạn muốn truyền công đã hết số lượt truyền công trong ngày");
return 0;
end

satthupro95
29-01-18, 06:31 PM
phải có thêm task lưu ngày nữa nhé, đặt nó ngay trên đầu, chẳng hạn của bạn là task 2024, với id 24 là lưu số lần dùng trong ngày, mình chọn id 23 là task lưu ngày


local nDate = tonumber(GetLocalDate("%y%m%d")); -- Kiểm tra ngày theo dạng năm,tháng,ngày ví dụ 20182901
if me.GetTask(2024, 23) < nDate then -- Kiểm tra xem sang ngày mới chưa, nếu task lưu ngày < ngày hiện tại thì set task lưu ngày = ngày hiện tại
me.SetTask(2024, 23, nDate);
me.SetTask(2024, 24, 0); -- Rs lại số lần truyền công ngày
end