PDA

View Full Version : [KT] Giúp đỡ làm NPC tự di chuyển theo tọa độ



kebactinh86
18-09-16, 08:36 PM
Số là đang mò viết code vận tiêu lục tung các code các npc thì thấy có cái code towerdefen có cái hộ tống npc viết bằng code nên mần mò viết theo .Code chạy ko có báo lỗi load nhưng khi thực thi hàm npcMove thì nó chỉ xóa npc tạo lại npc ngay vị trí đó chứ npc ko di chuyển ai ghóp ý code với
local tbNpc = Npc:GetClass("npc_tudichuyen");

tbNpc.tbNpcMoveLeft = {};
tbNpc.tbNpcMoveRight = {};
function tbNpc:OnDialog()
DoScript("\\script\\npc\\npc_tudichuyen.lua");

local tbOpt = {};
table.insert(tbOpt, 1, {"<pic=283><color=yellow>[Chức năng]<color> <color=cyan>NPC di chuyển<color>", self.SetNpcMoveAI, self,9713});

table.insert(tbOpt, 2, {"<pic=288>Kết Thúc đối thoại"});

Dialog:Say("<color=green>Xin Chào <color=cyan>" ..me.szName.. "<color>.",tbOpt);
end

local tbMove_Right = Lib:LoadTabFile("\\script\\npc\\toado\\npc_move_right.txt");
local tbBossMove = Lib:LoadTabFile("\\script\\ncp\\toado\\boss_move.txt");

for _, pos in ipairs(tbMove_Right) do
table.insert(tbNpc.tbNpcMoveRight, {tonumber(pos["TRAPX"]), tonumber(pos["TRAPY"])});
end


function tbNpc:SetNpcMoveAI(nNpcId)
local pNpc = KNpc.GetById(nNpcId);
if not pNpc then
return 0;
end
local tbNpcMove = {};
tbNpcMove = self.tbNpcMoveRight;

local nCurMapId, nCurPosX, nCurPosY = him.GetWorldPos();
him.Delete();

local pFightNpc = KNpc.Add2(9713, 150, -1, nCurMapId, nCurPosX, nCurPosY, 0, 0, 1);


-- tbInstancing.nGirlId = pFightNpc.dwId;

pFightNpc.szName = "Tiểu Liên";
pFightNpc.SetTitle("Do đội của <color=yellow>"..me.szName.."<color> hộ tống");
pFightNpc.SetCurCamp(0);

pFightNpc.RestoreLife();

-- pFightNpc.GetTempTable("Npc").tbOnArrive = {tbNpc.OnArrive, tbNpc, pFightNpc, me};

pFightNpc.AI_ClearPath();

for _,Pos in ipairs(tbNpcMove) do
if (Pos[1] and Pos[2]) then
pFightNpc.AI_AddMovePos(tonumber(Pos[1])*32, tonumber(Pos[2])*32)
Dialog:Say("<color=green>Xin Chào <color=cyan>" ..tonumber(Pos[1])*32 .. " + " ..tonumber(Pos[2])*32 .. "<color>.",tbOpt);
end
end;

pFightNpc.SetNpcAI(9, 50, 1,-1, 25, 25, 25, 0, 0, 0, me.GetNpc().nIndex);

-- tbInstancing.nGirlProStep = 1;
end


các cao thủ ẩn dật hết rùi pm vài ng mà ko ai trả lời nên vọc vạch tự viết trình gà mong mọi ng giúp đỡ 8-x8-x8-x8-x8-x8-x

visaothe123
19-09-16, 04:42 PM
Số là đang mò viết code vận tiêu lục tung các code các npc thì thấy có cái code towerdefen có cái hộ tống npc viết bằng code nên mần mò viết theo .Code chạy ko có báo lỗi load nhưng khi thực thi hàm npcMove thì nó chỉ xóa npc tạo lại npc ngay vị trí đó chứ npc ko di chuyển ai ghóp ý code với
local tbNpc = Npc:GetClass("npc_tudichuyen");

tbNpc.tbNpcMoveLeft = {};
tbNpc.tbNpcMoveRight = {};
function tbNpc:OnDialog()
DoScript("\\script\\npc\\npc_tudichuyen.lua");

local tbOpt = {};
table.insert(tbOpt, 1, {"<pic=283><color=yellow>[Chức năng]<color> <color=cyan>NPC di chuyển<color>", self.SetNpcMoveAI, self,9713});

table.insert(tbOpt, 2, {"<pic=288>Kết Thúc đối thoại"});

Dialog:Say("<color=green>Xin Chào <color=cyan>" ..me.szName.. "<color>.",tbOpt);
end

local tbMove_Right = Lib:LoadTabFile("\\script\\npc\\toado\\npc_move_right.txt");
local tbBossMove = Lib:LoadTabFile("\\script\\ncp\\toado\\boss_move.txt");

for _, pos in ipairs(tbMove_Right) do
table.insert(tbNpc.tbNpcMoveRight, {tonumber(pos["TRAPX"]), tonumber(pos["TRAPY"])});
end


function tbNpc:SetNpcMoveAI(nNpcId)
local pNpc = KNpc.GetById(nNpcId);
if not pNpc then
return 0;
end
local tbNpcMove = {};
tbNpcMove = self.tbNpcMoveRight;

local nCurMapId, nCurPosX, nCurPosY = him.GetWorldPos();
him.Delete();

local pFightNpc = KNpc.Add2(9713, 150, -1, nCurMapId, nCurPosX, nCurPosY, 0, 0, 1);


-- tbInstancing.nGirlId = pFightNpc.dwId;

pFightNpc.szName = "Tiểu Liên";
pFightNpc.SetTitle("Do đội của <color=yellow>"..me.szName.."<color> hộ tống");
pFightNpc.SetCurCamp(0);

pFightNpc.RestoreLife();

-- pFightNpc.GetTempTable("Npc").tbOnArrive = {tbNpc.OnArrive, tbNpc, pFightNpc, me};

pFightNpc.AI_ClearPath();

for _,Pos in ipairs(tbNpcMove) do
if (Pos[1] and Pos[2]) then
pFightNpc.AI_AddMovePos(tonumber(Pos[1])*32, tonumber(Pos[2])*32)
Dialog:Say("<color=green>Xin Chào <color=cyan>" ..tonumber(Pos[1])*32 .. " + " ..tonumber(Pos[2])*32 .. "<color>.",tbOpt);
end
end;

pFightNpc.SetNpcAI(9, 50, 1,-1, 25, 25, 25, 0, 0, 0, me.GetNpc().nIndex);

-- tbInstancing.nGirlProStep = 1;
end


các cao thủ ẩn dật hết rùi pm vài ng mà ko ai trả lời nên vọc vạch tự viết trình gà mong mọi ng giúp đỡ 8-x8-x8-x8-x8-x8-x
Code này liên quan tới file txt tọa độ, nên k thể duy chuyển, nhưng Code này k thể dùng đc, liên kết rất nhiều script và txt.. Bác Tính làm hộ tống vạn tiêu ???.................

kebactinh86
19-09-16, 05:51 PM
Vâng bác chính là cái độ tống vận tiêu đó.Mình có thử xuất 2 biến tọa độ load từ trong file txt ra thì thấy tọa độ chuẩn so vs mình để bên file txt rồi mà sao npc chỉ xóa npc cũ và tạo 1 npc mới đứng yên đó thôi bác ah

visaothe123
19-09-16, 06:07 PM
Vâng bác chính là cái độ tống vận tiêu đó.Mình có thử xuất 2 biến tọa độ load từ trong file txt ra thì thấy tọa độ chuẩn so vs mình để bên file txt rồi mà sao npc chỉ xóa npc cũ và tạo 1 npc mới đứng yên đó thôi bác ah

ip sdt add yahoo.. code đó fixx nhiều thứ, vì nó liên kết với n.vụ .. nên cần fix nhiều file.

hxhhxhz
19-09-16, 07:28 PM
ip sdt add yahoo.. code đó fixx nhiều thứ, vì nó liên kết với n.vụ .. nên cần fix nhiều file.

chỉ e làm với a .. e cũng mún thử cái scrip vận tiêu này mà làm hoài k dc

satthupro95
19-09-16, 09:48 PM
nghiên cứu cái protect npc, truyền tham số vào hàm :D

__Jie__
19-09-16, 10:05 PM
Làm trong code thì hình như chỉ di chuyển dc trong 1 map không thể qua map khác (chưa view sâu vào code nên không biết có thể mở rộng không).

Nên nghiên cứu về task_publish lão toại hình như biết pm lão thử :)

kebactinh86
20-09-16, 07:55 PM
Task mình có unpack ra cũng tìm tới chỗ nó gọi protec NPC cơ mà ko thấy khúc truyền tọa độ và ko biết khúc npc gọi hoặc load file xml ra sao hihi:">:">:">

kebactinh86
23-09-16, 09:04 PM
local tbNpc = Npc:GetClass("hotongMiNu");

tbNpc.tbTrack = {
{1696, 3659},
{1680, 3613},
{1674, 3581},
{1647, 3544},
{1604, 3522},
{1640, 3483 },
{1630, 3417},
{1652, 3361},
{1645, 3313},
{1679, 3374},
{1727, 3348},
{1769, 3367},

}

tbNpc.NRANGE = 200;

local tbEvent =
{
Player.ProcessBreakEvent.emEVENT_MOVE,
Player.ProcessBreakEvent.emEVENT_ATTACK,
Player.ProcessBreakEvent.emEVENT_SITE,
Player.ProcessBreakEvent.emEVENT_USEITEM,
Player.ProcessBreakEvent.emEVENT_ARRANGEITEM,
Player.ProcessBreakEvent.emEVENT_DROPITEM,
Player.ProcessBreakEvent.emEVENT_SENDMAIL,
Player.ProcessBreakEvent.emEVENT_TRADE,
Player.ProcessBreakEvent.emEVENT_CHANGEFIGHTSTATE,
Player.ProcessBreakEvent.emEVENT_CLIENTCOMMAND,
Player.ProcessBreakEvent.emEVENT_ATTACKED,
Player.ProcessBreakEvent.emEVENT_DEATH,
Player.ProcessBreakEvent.emEVENT_LOGOUT,
}


function tbNpc:OnDialog()
DoScript("\\script\\Copdakto\\npc\\HoTong.lua");
local nKeys = me.GetItemCountInBags(18,1,95,1);

--if nKeys > 0 then
Dialog:Say("Hiệp sĩ, không tìm được chiếc chìa khóa đó sao?", {
{"Nào, để ta giúp ngươi mở chiếc khóa này!", tbNpc.Release, tbNpc, him.dwId},
{"Hãy đợi", tbNpc.OnExit, tbNpc},
});
--else
--Dialog:Say("Cái bọn khốn khiếp đó…chỉ cần ngươi mở giúp ta cái khóa chết tiệt này, ta sẽ giúp ngươi mở đại môn đó, tiêu diệt sạch lũ cướp kia!");
--return;
--end;
end;


function tbNpc:Release(nNpcId)
local nKeys = me.GetItemCountInBags(18,1,95,1);

--if nKeys <=0 then
-- Dialog:Say("Hầy!...Cứ đi trong thành, ráng tìm cho được chiếc chìa khóa đó đi!");
-- return;
--end;

local pNpc = KNpc.GetById(nNpcId);

if not pNpc then return; end;

me.ConsumeItemInBags(1, 18, 1, 95, 1);

local pDialogNpc = KNpc.GetById(pNpc.dwId);


local tbFightNpc = {10141, 10234, 20152, 2421, 2422, 2423, 2424, 2425, 2426};
local nRand = MathRandom(#tbFightNpc);
local tbNpcFight = tbFightNpc[nRand];
local nCurMapId, nCurPosX, nCurPosY = pNpc.GetWorldPos();
--pNpc.Delete();

local pFightNpc = KNpc.Add2(tbNpcFight, 1, -1, nCurMapId, nCurPosX, nCurPosY, 0, 0, 1);


--pFightNpc.szName = "Úy Lữ";
pFightNpc.SetTitle(" Do đội <color=yellow>"..me.szName.."<color> bảo vệ");
pFightNpc.SetCurCamp(0);

pFightNpc.RestoreLife();

pFightNpc.AI_ClearPath();
--pFightNpc.AddTaskState(1475);
for _,Pos in ipairs(self.tbTrack) do
if (Pos[1] and Pos[2]) then
pFightNpc.AI_AddMovePos(tonumber(Pos[1])*32, tonumber(Pos[2])*32)
end
end

pFightNpc.SetNpcAI(9, 0, 0, -1, 25, 25, 25, 0, 0, 0, 0, me.GetNpc().nIndex);
--Timer:Register(12 * Env.GAME_FPS, self.Chat, self, pFightNpc);

end;

function tbNpc:Chat(pFightNpc)
if pFightNpc then
local tbMsg = {"Bọn bây rồi sẽ biết mùi vị đau đớn như thế nào...",
"Đói bụng quá không thể về nhà được~~~",
"Các ngươi đâu cả rồi~~~",
"Hãy xem ta đây~~~",
"Theo gái sướng hơn~~~",
"Giết hết, giết hết~~~~",
"Nơi đây vốn không phải là địa bàn của các ngươi!~~~",
"Chào mừng bạn đến với Ngọa Long Kiếm!"};
local nRand = MathRandom(#tbMsg);
pFightNpc.SendChat(tbMsg[nRand]);
end
end;

-- 護送 NPC 小憐被殺死
function tbNpc:OnDeath(pNpc)
local nMapId, nMapX, nMapY = him.GetWorldPos();
local tbInstancing = TreasureMap:GetInstancing(nMapId);

tbInstancing.nGirlKilled = 1;
end;



Mình đã làm cho npc di chuyển theo tọa độ add bên trên trong map dc rồi.Nói chung chỉ cần di chuyển trong map cố định thôi không cần quá cáo siêu.Nhưng bây giờ mình muốn chèn cái code khi đến vị trí cuối thì nhận thưởng và xóa npc tiêu xa

for _,Pos in ipairs(self.tbTrack) do
if (tonumber(Pos[1])==1769 and tonumber(Pos[2])==3367) then
thực thi lệnh xóa npc và add phần thưởng
end
end
nhưng mình không biết chèn code này vào khúc nào để nó thực thi so sánh tọa độ cuối.Ah còn cái check ng chơi bên cạnh nữa hjhj bí quá cao nhân nào giúp với 8->8->8->8->

wermanhme1990
23-09-16, 09:23 PM
nếu cách đó đang bí, có thể dùng cách trả tiêu xa cho npc như bên phong thần vậy.

kebactinh86
23-09-16, 11:01 PM
Trả tiêu xa là ở đích làm thêm 1 npc nữa khí bấm vào NPC đó thì check npc xung quang như câu cá rùi thực thi lệnh xóa npc và add phần thưởng đúng không bạn nhỉ:>:>:>:>:>:>

lctung2015
23-09-16, 11:25 PM
làm như vậy thì trả khác gì là vạn tiêu rồi, chứ phải hộ tiêu đâu :D, làm sao cho nó đến 1 tọa độ là nó tự xóa + phát thưởng luôn. lúc trước có chơi 1 sv nó như vậy.

kebactinh86
24-09-16, 06:15 AM
Thì tất nhiên mình cũng mún nó ngon lành nuột nà như vậy nhưng trình gà thì phải chịu khó chế cháo những thứ mình ko nghĩ ra cách xử lý hay hơn được thôi bác hjhj:):):):)

__Jie__
24-09-16, 11:48 AM
Làm được nhưng 1 lần chỉ di chuyển 1 NPC thôi :D. 2 Con chạy cùng 1 lúc là lỗi . Đang tìm hướng khắc phục

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

Code cho ai hứng thú vẫn chưa khắc phục dc lỗi 2 người cùng hộ tống nhé


local tbHoTong = {};
SpecialEvent.HoTong = tbHoTong;
tbHoTong.tbHoTongTrack = {
{1604, 3130},
{1595, 3120},
{1591, 3111},
{1595, 3095},
{1605, 3087},
{1618, 3093},
{1623, 3110},
}
tbHoTong.nMapId = 5;
function tbHoTong:OnDialog()
Dialog:Say("Hiệp sĩ, không tìm được chiếc chìa khóa đó sao?", {
{"Nào, để ta giúp ngươi mở chiếc khóa này!", tbHoTong.Release, tbHoTong, him.dwId},
{"Hãy đợi", tbHoTong.OnExit, tbHoTong},
});
end

function tbHoTong:Release(nNpcId)
local pNpc = KNpc.GetById(nNpcId);
if not pNpc then return; end;
local pDialogNpc = KNpc.GetById(nNpcId);
--[[ pDialogNpc.Delete();
if (self.nMoveNpcId) then
local pFightNpc = KNpc.GetById(self.nMoveNpcId);
if (pFightNpc) then
pFightNpc.Delete();
self.nMoveNpcId = nil;
end
end ]]
local tbHoTongFightNpc = {2474};
local nRand = MathRandom(#tbHoTongFightNpc);
local tbHoTongFight = tbHoTongFightNpc[nRand];

local nCurMapId, nCurPosX, nCurPosY = pNpc.GetWorldPos();
local pFightNpc = KNpc.Add2(tbHoTongFight, 1, -1, nCurMapId, nCurPosX, nCurPosY, 0, 0, 1);
pFightNpc.SetTitle(" Do đội <color=yellow>"..me.szName.."<color> bảo vệ");
self.nMoveNpcId = pFightNpc.dwId;
pFightNpc.SetCurCamp(0);
pFightNpc.RestoreLife();
pFightNpc.AI_ClearPath();
for _,Pos in ipairs(self.tbHoTongTrack) do
if (Pos[1] and Pos[2]) then
pFightNpc.AI_AddMovePos(tonumber(Pos[1])*32, tonumber(Pos[2])*32)
end
end

pFightNpc.SetNpcAI(9, 0, 0, -1, 25, 25, 25, 0, 0, 0, 0, me.GetNpc().nIndex);
self:RegRunTimer();
--self:RiseDialogNpc();
end;
function tbHoTong:RegRunTimer()
if (MODULE_GAMESERVER and not self.nRegisterRunTimerId) then
self.nRegisterRunTimerId = Timer:Register(18, self.OnTimer, self);
end
end
function tbHoTong:UnRegRunTimer()
if (MODULE_GAMESERVER and self.nRegisterRunTimerId) then
Timer:Close(self.nRegisterRunTimerId);
self.nRegisterRunTimerId = nil;
end
end
function tbHoTong:RiseDialogNpc()
if (MODULE_GAMESERVER and not self.nReviveDurationTimeId) then
self.nReviveDurationTimeId = Timer:Register(18, self.AddDialogNpc, self);
end;
end

-- 添加一個對話Npc
function tbHoTong:AddDialogNpc()
local pDialogNpc = KNpc.Add2(20118, 1, -1, self.nMapId, 1609, 3129);

self.nDialogNpcId = pDialogNpc.dwId;
self.nReviveDurationTimeId = nil;
return 0;
end
function tbHoTong:OnTimer()

if (not self.nMoveNpcId) then
self.nRegisterRunTimerId = nil;
return 0;
end
local pFightNpc = KNpc.GetById(self.nMoveNpcId);
if (not pFightNpc) then
self.nRegisterRunTimerId = nil;
return 0;
end
local nHimCurMapId, nHimCurPosX, nHimCurPosY = pFightNpc.GetWorldPos();

local bAtPos, szMsg = TaskCond:IsAtPos(self.nMapId, nHimCurPosX, nHimCurPosY, 30);
if (not bAtPos) then
me.Msg("Khoảng cách hộ tống quá xa, nhiệm vụ thất bại.")
pFightNpc.Delete();
self.nMoveNpcId = nil;
self.nRegisterRunTimerId = nil;
return 0;
end
if (TaskCond:IsNpcAtPos(self.nMoveNpcId, nHimCurMapId, 1623, 3110, 5) or pFightNpc.AI_IsArrival() == 1) then
me.Msg("Hộ tống thành công, hãy quay về nhận thưởng.")
pFightNpc.Delete();
self.nMoveNpcId = nil;
self:UnRegRunTimer();
end

return 18;
end

function tbHoTong:Chat(pFightNpc)
if pFightNpc then
local tbHoTongMsg = {"Bọn bây rồi sẽ biết mùi vị đau đớn như thế nào...",
"Đói bụng quá không thể về nhà được~~~",
"Các ngươi đâu cả rồi~~~",
"Hãy xem ta đây~~~",
"Theo gái sướng hơn~~~",
"Giết hết, giết hết~~~~",
"Nơi đây vốn không phải là địa bàn của các ngươi!~~~",
"Chào mừng bạn đến với Ngọa Long Kiếm!"};
local nRand = MathRandom(#tbHoTongMsg);
pFightNpc.SendChat(tbHoTongMsg[nRand]);
end
end;

-- 護送 NPC 小憐被殺死
function tbHoTong:OnDeath(pNpc)
local nMapId, nMapX, nMapY = him.GetWorldPos();
local tbHoTongInstancing = TreasureMap:GetInstancing(nMapId);

tbHoTongInstancing.nGirlKilled = 1;
end

kebactinh86
24-09-16, 05:10 PM
Thanks bằng hành động hjhjhj =P~=P~=P~=P~

__Jie__
27-09-16, 10:09 PM
Cái này là gì đây ta :D.

Ngày mưa gió ở SG may mắn fix xong lỗi 2 nhân vật. Chưa test kỹ nhưng cơ bản chắn ok


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

kebactinh86
27-09-16, 10:18 PM
mình đang tìm hiểu cách điều khiển golbaltask hình như set và xóa task này sẽ khống chế dc việc 2 ng cùng hộ tống thì phải mà code chưa chạy hjhj.Mới đến dc khúc thành công nhiệm vụ add túi quà trực tiếp rùi set task nhân vật thôi !;;);;);;)

__Jie__
27-09-16, 10:27 PM
Không cần chỉ cần 2 biến Timer:Register khác giá trị vs nhau là dc.

Ví dụ : Goi A = Timer:Register GS hiểu rằng file lua đang gọi Register = biến A . Có thể test bằng cách tạo 2 file lua giống nhau thì sẽ không bị lỗi.

Từ đó rút ra được mỗi 1 file Lua chỉ có thể gán 1 giá trị cho Timer:Register để chạy 1 hàm. Nếu 2 ng cùng gọi đến cùng 1 file Lua cùng gán biến giá trị giống nhau cho Timer:Register thì chỉ có 1 trong 2 thực thi được.

===> Thay đổi liên tục giá trị biến Timer:Register là xong :D

Theo như tôi hiễu là như vậy cũng ngồi mò cả buổi tối mới xong :D.

wermanhme1990
27-09-16, 11:03 PM
Hai ông nghiên cứu ghê nhỉ, đợt này tui đang dev lại kiếm thế, mà chưa rảnh, để lúc nào làm cái chức năng giống 2 ông cho vui.

kebactinh86
28-09-16, 06:40 AM
2 ng đi chung 1 đường thì bàn luận nó mới vui vui.Hay bác ngâm thử cái xml trong task_publish rùi chỉ giáo lại anh em .Có unpak nó ra mà không hiểu nó truyền vào file lua ra sao hì hì :-":-":-"