PDA

View Full Version : [KT] Hàm đọc thời gian NPC sinh ra sau khi thực hiện đối thoại hoặc thao tác nhận đồ



leanhducxh
23-01-13, 10:27 PM
mình đang đọc bài viết bạn share file npc

<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>

có bạn đã share 1 đoạn code


local self = tbtgNpc;

local tbtgNpc = Map.tbtgNpc or {};
Map.tbNpc = tbNpc;
local CountThat = 0;
local nState = 0;
local nTimerId1 = 0;
local pTimerClose = 0;
local tbGetParam = {};
local uiSayPanel = Ui(Ui.UI_SAYPANEL);

local szCmd = [=[
Map.tbtgNpc:tgNpcSwitch();
]=];

function tbtgNpc:tgNpcSwitch()
local nMyMapId, nMyPosX, nMyPosY = me.GetWorldPos();
me.Msg(nMyMapId..","..nMyPosX..","..nMyPosY);
for i=1, 7000 do
CountThat = CountThat +1;
local nId = self:GetAroundNpcId(CountThat);
if nId then
local tbFileData = Lib:LoadTabFile("\\setting\\npc\\npc.txt");
for nRowNum, tbRow in ipairs(tbFileData or {}) do
if (tbRow.Id == ""..CountThat.."") then
local bSuccess = me.Msg("<color=green>"..tbRow.Name.." <color=gold> "..CountThat);
break;
end
end
end
end
CountThat = 0;
self:Reload();
end

function tbtgNpc:GetAroundNpcId(nTempId)
local tbAroundNpc = KNpc.GetAroundNpcList(me, 10);
for _, pNpc in ipairs(tbAroundNpc) do
if (pNpc.nTemplateId == nTempId) then
return pNpc.nIndex
end
end
return
end

function tbtgNpc:Reload()
local function fnDoScript(szFilePath)
local szFileData = KFile.ReadTxtFile(szFilePath);
assert(loadstring(szFileData, szFilePath))();
end
fnDoScript("\\interface\\spr_tool\\script\\window\\GetIdNpc.lu a");
me.Msg("<color=yellow>------------");
end

local tCmd={"Map.tbGetIdNpc:GetIdNpcSwitch()", "tgNpc", "", "Alt+1+2", "Alt+1+2", "tgdNpc"};
AddCommand(tCmd[4], tCmd[3], tCmd[2], tCmd[7] or UiShortcutAlias.emKSTATE_INGAME);
UiShortcutAlias:AddAlias(tCmd[2], tCmd[1]);





nhưng k hiểu lắm .ai có thể giúp mình đc k ?

Mình muốn set 1 npc trong thành , khi thực hiện thao tác vào nó thành công
ví dụ , nhận đồ gì đó .

NPC đó sẽ biến mất
(chạy theo hàm của mình như sau :)


function tbbantiec:GetQuest(nPlayerId, nNpcId)
local pPlayer = KPlayer.GetPlayerObjById(nPlayerId)
if (not pPlayer) then
return;
end
local pNpc = KNpc.GetById(nNpcId);
if (not pNpc) then
return;
end
local i = 0;
local nAdd = 0;
local nRand = 0;
local nIndex = 0;
-- random
nRand = MathRandom(1, 10000);
-- fill 3 rate
local tbRate = {3000,1500,1000,1500,3000};
local tbAward =
{
[1] = {me.AddExp(1000000)};
[2] = {me.AddJbCoin(5000000)};
[3] = {me.AddBindCoin(5000000)};
[4] = {me.AddExp(5000000)};
[5] = {18,1,377,1};
}

for i = 1, 5 do
nAdd = nAdd + tbRate[i];
if nAdd >= nRand then
nIndex = i;
break;
end
end
local pItem = me.AddItem(unpack(tbAward[nIndex]));
if pItem then
pPlayer.SetItemTimeout(pItem, os.date("%Y/%m/%d/%H/%M/%S", GetTime() + 7*24*3600), 0);
end
pNpc.Delete();
return 0;
end


pNpc.Delete(); ~~> là đoạn xóa npc sau khi thực hiện thao tác xong .

làm sao để npc đó tự động hiện lên sau xxx giây ???


mình đã add thêm 1 phần code mới như sau :


pNpc.Delete();
local _, nMyMapX, nMyMapY = me.GetWorldPos();
for _, pPlayer in ipairs(KPlayer.GetAroundPlayerList(me.nId, 50)) do
if (pPlayer.szName ~= me.szName) then
local _, nMapX, nMapY = pPlayer.GetWorldPos();
local nDistance = (nMapX - nMyMapX) ^ 2 + (nMapY - nMyMapY) ^ 2;
tbPlayer[#tbPlayer+1] = {nDistance, pPlayer};
end
end
local nMapId, nPosX, nPosY = me.GetWorldPos();
KNpc.Add2(9623, 150, 150, nMapId, nPosX, nPosY);
return 0;


Sau khi đối thoai , nhận đc item , sau đó npc biến mất. đã tự động tạo thêm npc . nhưng lại không đối thoại đc với npc đó .


Cảm ơn nhiều !

hongphat7997
23-01-13, 11:56 PM
code:

local self = tbtqNpc;

local tbtqNpc = Map.tbtqNpc or {};
Map.tbNpc = tbNpc;
local CountThat = 0;
local nState = 0;
local nTimerId1 = 0;
local pTimerClose = 0;
local tbGetParam = {};
local uiSayPanel = Ui(Ui.UI_SAYPANEL);
local nCurTime = tonumber(os.date("%H%M", GetTime()))
a= AddNPC
hideNPC(a)
local szCmd = [=[
Map.tbEat:CHNSwitch();
]=];

function tbEat:CHNSwitch()
if nState == 0 then
nState = 1;
UiManager:OpenWindow("UI_INFOBOARD", "<bclr=Black><color=Yellow>Nhận Kinh Nghiệm<color>");
nTimerId1 = Ui.tbLogic.tbTimer:Register(1 * Env.GAME_FPS,self.OneTimes,self);
elseif nState == 1 then
nState = 0;
pTimerClose = 0;
Ui.tbLogic.tbTimer:Close(nTimerId1);
nTimerId1 = 0;
UiManager:OpenWindow("UI_INFOBOARD", "<color=white>Dừng lại<color>");
self:Refresh();
end
end

function tbEat:OneTimes()
if UiManager:WindowVisible(Ui.UI_SKILLPROGRESS) == 1 then
return
end
local tbFind = me.FindItemInBags(18,1,351,1);--18,1,351,1 TLD
for j, tbItem in pairs(tbFind) do
me.UseItem(tbItem.pItem);
me.AnswerQestion(1);
me.AnswerQestion(0);
end
end

function tbEat:Refresh()
local function fnDoScript(szFilePath)
local szFileData = KFile.ReadTxtFile(szFilePath);
assert(loadstring(szFileData, szFilePath))();
end
fnDoScript("\\interface\\Tools\\script\\window\\tq.lua");
me.Msg("<color=yellow>Chương trình kết thúc!");
end


local tCmd={"Map.tbEat:CHNSwitch()", "CHN", "", "Ctrl+Shift+E", "Ctrl+Shift+E", "CHN"};
AddCommand(tCmd[4], tCmd[3], tCmd[2], tCmd[7] or UiShortcutAlias.emKSTATE_INGAME);
UiShortcutAlias:AddAlias(tCmd[2], tCmd[1]);
UiShortcutAlias:AddAlias(tCmd[2], tCmd[1]);

leanhducxh
24-01-13, 12:40 AM
fnDoScript("\\interface\\Tools\\script\\window\\tq.lua");

đoạn này có nội dung là gì vậy bạn ?

nếu như code của mình ở phía trên kia , thì áp dụng vào thế nào ?

hongphat7997
24-01-13, 01:12 AM
fnDoScript("\\interface\\Tools\\script\\window\\tq.lua");

đoạn này có nội dung là gì vậy bạn ?

nếu như code của mình ở phía trên kia , thì áp dụng vào thế nào ?
tq.lua edit thành tqNpc.lua nha.do mình viết thiếu

local self = tbtqNpc;

local tbtqNpc = Map.tbtqNpc or {};
Map.tbNpc = tbNpc;
local CountThat = 0;
local nState = 0;
local nTimerId1 = 0;
local pTimerClose = 0;
local tbGetParam = {};
local uiSayPanel = Ui(Ui.UI_SAYPANEL);
local nCurTime = tonumber(os.date("%H%M", GetTime()))
a= AddNPC
hideNPC(a)
local szCmd = [=[
Map.tbEat:CHNSwitch();
]=];

function tbEat:CHNSwitch()
if nState == 0 then
nState = 1;
UiManager:OpenWindow("UI_INFOBOARD", "<bclr=Black><color=Yellow>Nhận Kinh Nghiệm<color>");
nTimerId1 = Ui.tbLogic.tbTimer:Register(1 * Env.GAME_FPS,self.OneTimes,self);
elseif nState == 1 then
nState = 0;
pTimerClose = 0;
Ui.tbLogic.tbTimer:Close(nTimerId1);
nTimerId1 = 0;
UiManager:OpenWindow("UI_INFOBOARD", "<color=white>Dừng lại<color>");
self:Refresh();
end
end

function tbEat:OneTimes()
if UiManager:WindowVisible(Ui.UI_SKILLPROGRESS) == 1 then
return
end
local tbFind = me.FindItemInBags(18,1,351,1);--18,1,351,1 TLD
for j, tbItem in pairs(tbFind) do
me.UseItem(tbItem.pItem);
me.AnswerQestion(1);
me.AnswerQestion(0);
end
end

function tbEat:Refresh()
local function fnDoScript(szFilePath)
local szFileData = KFile.ReadTxtFile(szFilePath);
assert(loadstring(szFileData, szFilePath))();
end
fnDoScript("\\interface\\Tools\\script\\window\\tqNpc.lua");
me.Msg("<color=yellow>Chương trình kết thúc!");
end


local tCmd={"Map.tbEat:CHNSwitch()", "CHN", "", "Ctrl+Shift+E", "Ctrl+Shift+E", "CHN"};
AddCommand(tCmd[4], tCmd[3], tCmd[2], tCmd[7] or UiShortcutAlias.emKSTATE_INGAME);
UiShortcutAlias:AddAlias(tCmd[2], tCmd[1]);
UiShortcutAlias:AddAlias(tCmd[2], tCmd[1]);

leanhducxh
24-01-13, 01:24 AM
mình đã add thêm 1 phần code mới như sau :


pNpc.Delete();
local _, nMyMapX, nMyMapY = me.GetWorldPos();
for _, pPlayer in ipairs(KPlayer.GetAroundPlayerList(me.nId, 50)) do
if (pPlayer.szName ~= me.szName) then
local _, nMapX, nMapY = pPlayer.GetWorldPos();
local nDistance = (nMapX - nMyMapX) ^ 2 + (nMapY - nMyMapY) ^ 2;
tbPlayer[#tbPlayer+1] = {nDistance, pPlayer};
end
end
local nMapId, nPosX, nPosY = me.GetWorldPos();
KNpc.Add2(9623, 150, 150, nMapId, nPosX, nPosY);
return 0;


Sau khi đối thoai , nhận đc item , sau đó npc biến mất. đã tự động tạo thêm npc . nhưng lại không đối thoại đc với npc đó .
để quay lại vòng lặp ban đầu ...

nguyenhophuc87
24-01-13, 03:29 PM
Hi, vấn đề này tối qua bạn hiền đã fix hoàn toàn. AE khỏi cmd nữa nhá =P~