[KT] Xin Hướng Dẫn Về Hộ Tống
Hello & Welcome to our community. Is this your first visit? Đăng Ký
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 4 của 4
  1. #1
    Vi phạm quy định
    Ngày tham gia
    Mar 2014
    Bài viết
    365
    Thanks
    118
    Thanked 25 Times in 25 Posts

    Xin Hướng Dẫn Về Hộ Tống

    Như tiêu đề.. xin hướng dẫn về vấn đề hộ tống giống Scrip làm nhiệm vụ hộ tống
    ai có thể giúp e với.. e mún làm vấn đề Vận Tiêu Ạ ..
    Mong Pro giúp e hoặc chỉ dẫn cho e với ạ
    ....................
    --Tks trước ạ
    Khách viếng thăm hãy cùng hxhhxhz xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  2. #2
    Thành Viên Tâm Huyết satthupro95's Avatar
    Ngày tham gia
    Jan 2012
    Bài viết
    2,393
    Thanks
    2,566
    Thanked 1,824 Times in 867 Posts

    Ðề: Xin Hướng Dẫn Về Hộ Tống

    tính năng này hot lắm, không ai share đâu, giờ có mỗi con kiemthemoira làm được
    Khách viếng thăm hãy cùng satthupro95 xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  3. #3
    Vi phạm quy định
    Ngày tham gia
    Mar 2014
    Bài viết
    365
    Thanks
    118
    Thanked 25 Times in 25 Posts

    Ðề: Xin Hướng Dẫn Về Hộ Tống

    Trích dẫn Gửi bởi satthupro95 [Only registered and activated users can see links. ]
    tính năng này hot lắm, không ai share đâu, giờ có mỗi con kiemthemoira làm được
    PHP Code:
    local tb    Task:GetTarget("ProtectNpc");
    tb.szTargetName        "ProtectNpc";
    tb.REFRESH_FRAME     18;
    --
    tb.CHIEFSKILLID        100; -- Escort phụ trách Id kỹ năng con ngườiđóng cửa khi các mục tiêu được đóng vào đầu tải
    -- Tham số Mô tả
    -- Id đối thoại NPC mẫuđối thoại bàn chải NPC khoảng thời gianlựa chọn đối thoạitrò chuyệnđi bộ Id mẫu NPCđi bộ NPC lớpId bản đồngười chơi có thể để lại các điểm mục tiêu xa nhất phối xy tọa độ của mục tiêumục tiêu bán kínhcác tuyến đườnghoàn thành trước khi bong bóngsau khi hoàn thành các bong bóng
    function tb:Init(nDialogNpcTempIdnMapPosXnMapPosYnIntervalszOptionszMsgnMoveNpcTempIdnMoveNpcLevelnMapIdnMaxDistancenLimitTimenAimXnAimYnAimRszTrackszBeforePopstrRszLaterPopnAttartRate)
        
    self.nDialogNpcTempId    nDialogNpcTempId;
        
    self.nMapPosX            nMapPosX;
        
    self.nMapPosY            nMapPosY;
        
    self.nInterval            nInterval;
        
    self.szDialogNpcName    KNpc.GetNameByTemplateId(nDialogNpcTempId);
        
    self.szOption            szOption;
        
    self.szMsg                szMsg;
        
    self.nMoveNpcTempId        nMoveNpcTempId;
        
    self.szMoveNpcName        KNpc.GetNameByTemplateId(nMoveNpcTempId)
        
    self.nMoveNpcLevel        nMoveNpcLevel;
        
    self.nMapId                nMapId;
        
    self.szMapName            Task:GetMapName(nMapId);
        
    self.nMaxDistance        nMaxDistance;
        
    self.nLimitTime            nLimitTime;
        
    self.nAimX                nAimX;
        
    self.nAimY                nAimY;
        
    self.nAimR                nAimR;
        
    self.tbTrack            self:ParseTrack(szTrack);
        
    self.szBeforePop        szBeforePop;
        
    self.szLaterPop            szLaterPop;
        
    self.nAttartRate         tonumber(nAttartRate) or 20;
        
    self:IniTarget();
    end;

    --
    Đi bộ chuỗi phân tích cú pháp
    function tb:ParseTrack(szTrack)
        if (
    not szTrack or szTrack == ""then
            
    return;
        
    end
        local tbRet 
    = {};
        
    local tbTrack Lib:SplitStr(szTrack"\n")
        for 
    i=1#tbTrack do
            
    if (tbTrack[i] and tbTrack[i] ~= ""then
                local tbPos 
    Lib:SplitStr(tbTrack[i]);
                
    table.insert(tbRettbPos);
            
    end
        end
        
        
    return tbRet;
    end


    function tb:IniTarget()
        if (
    MODULE_GAMESERVERthen
            
    if (not self.bStartthen
                local pDialogNpc 
    KNpc.Add2(self.nDialogNpcTempId1, -1self.nMapIdself.nMapPosXself.nMapPosY);
                if (
    not pDialogNpcthen
                    
    return;
                
    end
                self
    .nDialogNpcId pDialogNpc.dwId;
                
    Timer:Register(Env.GAME_FPS 60self.OnCheckNpcExistself);
                
    self.bStart true;
            
    end
        end
    end
    ;

    -- 
    Để ngăn chặn mất mát vô tình gây ra NPC
    function tb:OnCheckNpcExist()
        if (
    Task:IsNpcExist(self.nDialogNpcIdself) == 1then
            
    return;
        
    end
        
        
    if (self.nReviveDurationTimeIdthen
            
    return;
        
    end
        
        self
    .nDialogNpcId nil;
        
    self.nReviveDurationTimeId nil;
        
        
    self:AddDialogNpc();
    end

    -- Bắt đầu
    function tb:Start()
        
    self.bDone 0;
        
    self:RegisterTalk();
    end;

    function 
    tb:Save(nGroupIdnStartTaskId)
        
    self.tbSaveTask    = {    --Dưới đây bảo tồnbất cứ lúc nào sau khi khách hàng có thể đồng bộ hóa tự
            nGroupId        
    nGroupId,
            
    nStartTaskId    nStartTaskId,
        };
        
    self.me.SetTask(nGroupIdnStartTaskIdself.bDone);
        return 
    1;
    end;

    function 
    tb:Load(nGroupIdnStartTaskId)
        
    self.tbSaveTask    = {    -- Dưới đây bảo tồnbất cứ lúc nào sau khi khách hàng có thể đồng bộ hóa tự
            nGroupId        
    nGroupId,
            
    nStartTaskId    nStartTaskId,
        };
        
    self.bDone    self.me.GetTask(nGroupIdnStartTaskId);
        
        if (
    not self:IsDone()) then    -- Một khi mục tiêu này đạt được sẽ không thất bại
            self
    :RegisterTalk();
        
    end;
        
        return 
    1;
    end;

    function 
    tb:IsDone()
        return 
    self.bDone == 1;
    end;

    function 
    tb:GetDesc()
        return 
    self:GetStaticDesc();
    end;

    function 
    tb:GetStaticDesc()
        return 
    "Hộ tống "..self.szMoveNpcName;
    end;


    function 
    tb:Close(szReason)
        
    self:UnReg_Npc_RunTimer();
        
    self:UnRegisterTalk();
        
        if (
    self.nMoveNpcIdthen
            local pFightNpc 
    KNpc.GetById(self.nMoveNpcId);
            if (
    pFightNpcthen
                pFightNpc
    .Delete();
            
    end
        end
    end
    ;


    -- 
    Đăng ký và NPC đối thoại
    function tb:RegisterTalk()
        
    self.tbTask:AddNpcMenu(self.nDialogNpcTempIdself.nMapIdself.szOptionself.OnTalkNpcself);
    end;

    function 
    tb:UnRegisterTalk()
        
    self.tbTask:RemoveNpcMenu(self.nDialogNpcTempId);
    end;

    function 
    tb:OnTalkNpc()
        if (
    not himthen
            
    return;
        
    end;
        
        if (
    self.nMapId ~= and self.nMapId ~= self.me.GetMapId()) then
            TaskAct
    :Talk("Thứ cần tìm "..self.szDialogNpcName.." không có trong bản đồ, hãy đi về phía trước"..self.szMapName)
            return;
        
    end;
        
    local oldPlayer me;
        
    me self.me;
        
    TaskAct:Talk(self.szMsgself.OnTalkFinishself);
        
    me oldPlayer;
        
        
    self.nMyDialogNpcId him.dwId;
    end;

    -- 
    Sau khi đối thoại sẽ xóa các cuộc đối thoại hiện NPCở một nơi được chỉ định để đi bộ NPC bàn chảivà để cho anh ta đi bộvà đăng ký hẹn giờ quy định thời gian và sau đó chải một cuộc đối thoại NPC
    function tb:OnTalkFinish()
        if (
    self.nMyDialogNpcId ~= self._tbBase.nDialogNpcIdthen
            
    return;
        
    end
        
        
    -- Trận chiến đối thoại lần lượt
        self
    :Dialog2Fight();     
        
        --
    Đăng ký hẹn giờ để xóa NPC thời gianđể xem các cầu thủ từ NPC khoảng cách mỗi giâynếu khoảng cách bị xóa
        self
    :Reg_Npc_RunTimer();
        
        -- 
    Sau khi đăng ký thời gian quy định để đánh đối thoại NPC
        self
    ._tbBase:RiseDialogNpc();
    end;


    function 
    tb:Dialog2Fight()
        
    assert(MODULE_GAMESERVER);
        
    local pDialogNpc KNpc.GetById(self._tbBase.nDialogNpcId);
        
    assert(pDialogNpc);
        
    local nCurMapIdnCurPosXnCurPosY pDialogNpc.GetWorldPos();
        
        
    pDialogNpc.Delete(); 
        
    self._tbBase.nDialogNpcId nil;
        
        -- 
    Di chuyển cổ áo trước
        
    if (self.nMoveNpcIdthen
            local pFightNpc 
    KNpc.GetById(self.nMoveNpcId);
            
            if (
    pFightNpcthen
                pFightNpc
    .Delete();
                
    self.nMoveNpcId nil;
            
    end
        end
        
        local pFightNpc    
    KNpc.Add2(self.nMoveNpcTempIdself.nMoveNpcLevel, -1self.nMapIdnCurPosXnCurPosY001);
        
    assert(pFightNpc); 
        
    pFightNpc.SetCurCamp(0);
        
    local szTitle " Do đội <color=yellow>"..self.me.szName.."<color> hộ tống";
        
    pFightNpc.SetTitle(szTitle);
        
    Npc:RegPNpcOnDeath(pFightNpcself.OnDeathself);
        
    self.nMoveNpcId pFightNpc.dwId;
        
        
    pFightNpc.AI_ClearPath();
        for 
    _,Pos in ipairs(self.tbTrack) do
            if (
    Pos[1] and Pos[2]) then
                pFightNpc
    .AI_AddMovePos(tonumber(Pos[1])*32tonumber(Pos[2])*32)
            
    end
        end 
        
        pFightNpc
    .AI_AddMovePos(tonumber(self.nAimX)*32tonumber(self.nAimY)*32);-- 終點為目標
        pFightNpc
    .SetNpcAI(9self.nAttartRate1,-1252525000self.me.GetNpc().nIndex);    
    end

    function tb:RiseDialogNpc()
        
    assert(self._tbBase)
        
    assert(not self._tbBase._tbBase)
        if (
    MODULE_GAMESERVERthen
            self
    .nReviveDurationTimeId Timer:Register(Env.GAME_FPS self.nIntervalself.AddDialogNpcself);
        
    end;
    end

    -- Thêm một cuộc đối thoại NPC
    function tb:AddDialogNpc()
        
    assert(self._tbBase);
        
    assert(not self._tbBase._tbBase);
        
    assert(not self.nDialogNpcId);
        
    local pDialogNpc KNpc.Add2(self.nDialogNpcTempId1, -1self.nMapIdself.nMapPosXself.nMapPosY);
        
    assert(pDialogNpc)
        
        
    self.nDialogNpcId pDialogNpc.dwId;
        
    self.nReviveDurationTimeId nil;
        return 
    0;
    end


    function tb:Reg_Npc_RunTimer()
        
    self.nRunElapseTime 0;
        if (
    MODULE_GAMESERVER and not self.nRegisterRunTimerIdthen
            self
    .nRegisterRunTimerId Timer:Register(self.REFRESH_FRAMEself.OnRunTimerself);
        
    end;
    end;

    function 
    tb:UnReg_Npc_RunTimer()
        if (
    MODULE_GAMESERVER and self.nRegisterRunTimerIdthen
            Timer
    :Close(self.nRegisterRunTimerId);
            
    self.nRegisterRunTimerId    nil;
        
    end;
    end;

    -- 
    1. để xóa thời gian quy định chống NPC
    -- 2 phụ thuộc vào người chơi NPC khoảng cách từ con thứ hainếu khoảng cách thường được xóa
    --3. Mục tiêu là hoàn thành (và các cầu thủ đi))
    function 
    tb:OnRunTimer()
        if (
    not self.nMoveNpcIdthen
            self
    .nRegisterRunTimerId    nil;
            return 
    0;
        
    end
        
        local pFightNpc 
    KNpc.GetById(self.nMoveNpcId);
        if (
    not pFightNpcthen
            self
    .nRegisterRunTimerId    nil;
            return 
    0;
        
    end
        self
    .nRunElapseTime self.nRunElapseTime 1;
        if (
    self.nRunElapseTime self.nLimitTimethen -- Để thời gian quy địnhcác hộ tống thất bại
            pFightNpc
    .Delete();
            
    self.me.Msg("Không hộ tống thành công trong thời gian chỉ định"..self.szMoveNpcName..", quay về khởi điểm đối thoại lại để mở nhiệm vụ Hộ tống.")
            
    self.nMoveNpcId nil;
            
    self.nRegisterRunTimerId    nil;
            return 
    0;
        else
            
    local nHimCurMapIdnHimCurPosXnHimCurPosY pFightNpc.GetWorldPos();
            
    local oldme me;
            
    me self.me;
            
    local bAtPosszMsg    TaskCond:IsAtPos(self.nMapIdnHimCurPosXnHimCurPosYself.nMaxDistance);
            
    me oldme;
            if (
    not bAtPosthen
                pFightNpc
    .Delete();
                
    self.me.Msg("Khoảng cách hộ tống "..self.szMoveNpcName.."quá xa, nhiệm vụ thất bại, quay về đối thoại để mở nhiệm vụ Hộ tống.")
                
    self.nMoveNpcId nil;
                
    self.nRegisterRunTimerId    nil;
                return 
    0;
            
    end;

            
    local oldme me;
            
    me self.me;
            -- 
    Phân tích điểm đến
            
    if (TaskCond:IsNpcAtPos(pFightNpc.dwIdself.nMapIdself.nAimXself.nAimYself.nAimR) or pFightNpc.AI_IsArrival() == 1then
                self
    .bDone    =  1;
                
    self:ShareProtectNpc();
                
    local tbSaveTask    self.tbSaveTask;
                if (
    MODULE_GAMESERVER and tbSaveTaskthen    -- Đồng bộ tự cho khách hàngyêu cầu khách hàng để làm mới
                    self
    .me.SetTask(tbSaveTask.nGroupIdtbSaveTask.nStartTaskIdself.bDone1);
                    
    KTask.SendRefresh(self.meself.tbTask.nTaskIdself.tbTask.nReferIdtbSaveTask.nGroupId);
                
    end;
                
    pFightNpc.Delete();
                
    self.nMoveNpcId nil;
                
    self:UnReg_Npc_RunTimer();
                
    self.nRunElapseTime 0;
            
    end;
            
    me oldme;
            
            if (
    self:IsDone()) then    -- Một khi mục tiêu này đạt được sẽ không thất bại
                self
    .me.Msg("Mục tiêu:"..self:GetStaticDesc());
                
    self:UnReg_Npc_RunTimer();
                
    self:UnRegisterTalk();
                
    self.tbTask:OnFinishOneTag();
                
    self.nRunElapseTime 0;
                
    self.nRegisterRunTimerId    nil;
                return 
    0
            end
    ;
        
    end;
        
        return 
    self.REFRESH_FRAME;
    end;


    function 
    tb:ShareProtectNpc()
    --
    Qua tất cả các đồng đội của mình cho tất cả các nhiệm vụ bước mục tiêu hiện tạivà nếu mục tiêu này cũng giống như gọi OnTeamMateKillNpc
        local tbTeamMembers
    nMemberCount    self.me.GetTeamMemberList();
        if (
    not tbTeamMembersthen --Không thể chia sẻkhông có đội
            
    return;
        
    end
        
    if (nMemberCount <= 0then-- Không thể chia sẻkhông có thành viên trong nhóm
            
    return;
        
    end
        
        local nOldPlayerIndex 
    self.me.nPlayerIndex;
        for 
    1nMemberCount do
            
    local pPlayer    tbTeamMembers[i];
            if (
    pPlayer.nPlayerIndex ~= nOldPlayerIndexthen
                
    if (Task:AtNearDistance(pPlayerself.me) == 1then
                    
    for _tbTask in pairs(Task:GetPlayerTask(pPlayer).tbTasks) do
                        
                        for 
    _tbCurTag in pairs(tbTask.tbCurTags) do
                            
                            if (
    tbCurTag.szTargetName == self.szTargetNamethen
                                
    if (tbCurTag.nMoveNpcTempId == self.nMoveNpcTempId and
                                    (
    tbCurTag.nMapId == or tbCurTag.nMapId == self.nMapId)) then
                                    tbCurTag
    :OnTeamMateProtectNpc();
                                
    end
                            end
                        end
                    end
                end
            end
        end
    end
    ;


    function 
    tb:OnTeamMateProtectNpc()
        
    self.bDone  1;
        
    local tbSaveTask    self.tbSaveTask;
        if (
    MODULE_GAMESERVER and tbSaveTaskthen    -- Đồng bộ tự cho khách hàngyêu cầu khách hàng để làm mới
            self
    .me.SetTask(tbSaveTask.nGroupIdtbSaveTask.nStartTaskIdself.bDone1);
            
    KTask.SendRefresh(self.meself.tbTask.nTaskIdself.tbTask.nReferIdtbSaveTask.nGroupId);
        
    end;
        if (
    self:IsDone()) then    -- Một khi mục tiêu này đạt được sẽ không thất bại
            self
    .me.Msg("Mục tiêu:"..self:GetStaticDesc());
            
    self:UnReg_Npc_RunTimer();
            
    self:UnRegisterTalk();
            
    self.tbTask:OnFinishOneTag();
        
    end;
    end;


    function 
    tb:OnDeath()
        if (
    self:IsDone()) then
            
    return;
        
    end
        self
    .nMoveNpcId nil;
        
    self.me.Msg(self.szMoveNpcName.." đã chết, nhiệm vụ thất bại, quay về đối thoại để mở nhiệm vụ Hộ tống.");
    end 
    em tìm dc code này nhưng e k học về hàm nên e k bjt.. mấy pro giúp với .. e đã dịch 1 số thứ ra tiếng việc rồi nè

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

    PHP Code:
    local tb    Task:GetTarget("test3");
    tb.szTargetName        "test3";
    tb.REFRESH_FRAME     18;
    --
    tb.CHIEFSKILLID        100; -- Escort phụ trách Id kỹ năng con ngườiđóng cửa khi các mục tiêu được đóng vào đầu tải
    -- Tham số Mô tả
    -- Id đối thoại NPC mẫuđối thoại bàn chải NPC khoảng thời gianlựa chọn đối thoạitrò chuyệnđi bộ Id mẫu NPCđi bộ NPC lớpId bản đồngười chơi có thể để lại các điểm mục tiêu xa nhất phối xy tọa độ của mục tiêumục tiêu bán kínhcác tuyến đườnghoàn thành trước khi bong bóngsau khi hoàn thành các bong bóng
    function tb:Init(nDialogNpcTempIdnMapPosXnMapPosYnIntervalszOptionszMsgnMoveNpcTempIdnMoveNpcLevelnMapIdnMaxDistancenLimitTimenAimXnAimYnAimRszTrackszBeforePopstrRszLaterPopnAttartRate)
        
    self.nDialogNpcTempId    nDialogNpcTempId;
        
    self.nMapPosX            nMapPosX;
        
    self.nMapPosY            nMapPosY;
        
    self.nInterval            nInterval;
        
    self.szDialogNpcName    KNpc.GetNameByTemplateId(nDialogNpcTempId);
        
    self.szOption            szOption;
        
    self.szMsg                szMsg;
        
    self.nMoveNpcTempId        nMoveNpcTempId;
        
    self.szMoveNpcName        KNpc.GetNameByTemplateId(nMoveNpcTempId)
        
    self.nMoveNpcLevel        nMoveNpcLevel;
        
    self.nMapId                nMapId;
        
    self.szMapName            Task:GetMapName(nMapId);
        
    self.nMaxDistance        nMaxDistance;
        
    self.nLimitTime            nLimitTime;
        
    self.nAimX                nAimX;
        
    self.nAimY                nAimY;
        
    self.nAimR                nAimR;
        
    self.tbTrack            self:ParseTrack(szTrack);
        
    self.szBeforePop        szBeforePop;
        
    self.szLaterPop            szLaterPop;
        
    self.nAttartRate         tonumber(nAttartRate) or 20;
        
    self:IniTarget();
    end;
    --
    Đi bộ chuỗi phân tích cú pháp
    function tb:ParseTrack(szTrack)
        if (
    not szTrack or szTrack == ""then
            
    return;
        
    end
        local tbRet 
    = {};
        
    local tbTrack Lib:SplitStr(szTrack"\n")
        for 
    i=1#tbTrack do
            
    if (tbTrack[i] and tbTrack[i] ~= ""then
                local tbPos 
    Lib:SplitStr(tbTrack[i]);
                
    table.insert(tbRettbPos);
            
    end
        end
        
        
    return tbRet;
    end


    function tb:IniTarget()
        if (
    MODULE_GAMESERVERthen
            
    if (not self.bStartthen
                local pDialogNpc 
    KNpc.Add2(self.nDialogNpcTempId1, -1self.nMapIdself.nMapPosXself.nMapPosY);
                if (
    not pDialogNpcthen
                    
    return;
                
    end
                self
    .nDialogNpcId pDialogNpc.dwId;
                
    Timer:Register(Env.GAME_FPS 60self.OnCheckNpcExistself);
                
    self.bStart true;
            
    end
        end
    end
    ;

    -- 
    Để ngăn chặn mất mát vô tình gây ra NPC
    function tb:OnCheckNpcExist()
        if (
    Task:IsNpcExist(self.nDialogNpcIdself) == 1then
            
    return;
        
    end
        
        
    if (self.nReviveDurationTimeIdthen
            
    return;
        
    end
        
        self
    .nDialogNpcId nil;
        
    self.nReviveDurationTimeId nil;
        
        
    self:AddDialogNpc();
    end


    -- Bắt đầu
    function tb:Start()
        
    self.bDone 0;
        
    self:RegisterTalk();
    end;

    function 
    tb:Save(nGroupIdnStartTaskId)
        
    self.tbSaveTask    = {    --Dưới đây bảo tồnbất cứ lúc nào sau khi khách hàng có thể đồng bộ hóa tự
            nGroupId        
    nGroupId,
            
    nStartTaskId    nStartTaskId,
        };
        
    self.me.SetTask(nGroupIdnStartTaskIdself.bDone);
        return 
    1;
    end;

    function 
    tb:IsDone()
        return 
    self.bDone == 1;
    end;

    function 
    tb:GetDesc()
        return 
    self:GetStaticDesc();
    end;

    function 
    tb:GetStaticDesc()
        return 
    "Hộ tống "..self.szMoveNpcName;
    end;

    function 
    tb:Close(szReason)
        
    self:UnReg_Npc_RunTimer();
        
    self:UnRegisterTalk();
        
        if (
    self.nMoveNpcIdthen
            local pFightNpc 
    KNpc.GetById(self.nMoveNpcId);
            if (
    pFightNpcthen
                pFightNpc
    .Delete();
            
    end
        end
    end
    ;

    -- 
    Đăng ký và NPC đối thoại
    function tb:RegisterTalk()
        
    self.tbTask:AddNpcMenu(self.nDialogNpcTempIdself.nMapIdself.szOptionself.OnTalkNpcself);
    end;

    function 
    tb:UnRegisterTalk()
        
    self.tbTask:RemoveNpcMenu(self.nDialogNpcTempId);
    end;


    function 
    tb:OnTalkNpc()
        if (
    not himthen
            
    return;
        
    end;
        
        if (
    self.nMapId ~= and self.nMapId ~= self.me.GetMapId()) then
            TaskAct
    :Talk("Thứ cần tìm "..self.szDialogNpcName.." không có trong bản đồ, hãy đi về phía trước"..self.szMapName)
            return;
        
    end;
        
    local oldPlayer me;
        
    me self.me;
        
    TaskAct:Talk(self.szMsgself.OnTalkFinishself);
        
    me oldPlayer;
        
        
    self.nMyDialogNpcId him.dwId;
    end;

    -- 
    Sau khi đối thoại sẽ xóa các cuộc đối thoại hiện NPCở một nơi được chỉ định để đi bộ NPC bàn chảivà để cho anh ta đi bộvà đăng ký hẹn giờ quy định thời gian và sau đó chải một cuộc đối thoại NPC
    function tb:OnTalkFinish()
        if (
    self.nMyDialogNpcId ~= self._tbBase.nDialogNpcIdthen
            
    return;
        
    end
        
        
    -- Trận chiến đối thoại lần lượt
        self
    :Dialog2Fight();     
        
        --
    Đăng ký hẹn giờ để xóa NPC thời gianđể xem các cầu thủ từ NPC khoảng cách mỗi giâynếu khoảng cách bị xóa
        self
    :Reg_Npc_RunTimer();
        
        -- 
    Sau khi đăng ký thời gian quy định để đánh đối thoại NPC
        self
    ._tbBase:RiseDialogNpc();
    end;

    function 
    tb:Dialog2Fight()
        
    assert(MODULE_GAMESERVER);
        
    local pDialogNpc KNpc.GetById(self._tbBase.nDialogNpcId);
        
    assert(pDialogNpc);
        
    local nCurMapIdnCurPosXnCurPosY pDialogNpc.GetWorldPos();
        
        
    pDialogNpc.Delete(); 
        
    self._tbBase.nDialogNpcId nil;
        
        -- 
    Di chuyển cổ áo trước
        
    if (self.nMoveNpcIdthen
            local pFightNpc 
    KNpc.GetById(self.nMoveNpcId);
            
            if (
    pFightNpcthen
                pFightNpc
    .Delete();
                
    self.nMoveNpcId nil;
            
    end
        end
        
        local pFightNpc    
    KNpc.Add2(966990, -1855304108000001);
        
    assert(pFightNpc); 
        
    pFightNpc.SetCurCamp(0);
        
    local szTitle " Do đội <color=yellow>"..self.me.szName.."<color> hộ tống";
        
    pFightNpc.SetTitle(szTitle);
        
    Npc:RegPNpcOnDeath(pFightNpcself.OnDeathself);
        
    self.nMoveNpcId pFightNpc.dwId;
        
        
    pFightNpc.AI_ClearPath();
        for 
    _,Pos in ipairs(self.tbTrack) do
            if (
    Pos[1] and Pos[2]) then
                pFightNpc
    .AI_AddMovePos(tonumber(Pos[1])*32tonumber(Pos[2])*32)
            
    end
        end 
        
        pFightNpc
    .AI_AddMovePos(tonumber(self.nAimX)*32tonumber(self.nAimY)*32);-- 終點為目標
        pFightNpc
    .SetNpcAI(9self.nAttartRate1,-1252525000self.me.GetNpc().nIndex);    
    end

    function tb:RiseDialogNpc()
        
    assert(self._tbBase)
        
    assert(not self._tbBase._tbBase)
        if (
    MODULE_GAMESERVERthen
            self
    .nReviveDurationTimeId Timer:Register(Env.GAME_FPS self.nIntervalself.AddDialogNpcself);
        
    end;
    end

    -- Thêm một cuộc đối thoại NPC
    function tb:AddDialogNpc()
        
    assert(self._tbBase);
        
    assert(not self._tbBase._tbBase);
        
    assert(not self.nDialogNpcId);
        
    local pDialogNpc KNpc.Add2(966990, -1855304108000001);
        
    assert(pDialogNpc)
        
        
    self.nDialogNpcId pDialogNpc.dwId;
        
    self.nReviveDurationTimeId nil;
        return 
    0;
    end

    function tb:Reg_Npc_RunTimer()
        
    self.nRunElapseTime 0;
        if (
    MODULE_GAMESERVER and not self.nRegisterRunTimerIdthen
            self
    .nRegisterRunTimerId Timer:Register(self.REFRESH_FRAMEself.OnRunTimerself);
        
    end;
    end;

    function 
    tb:UnReg_Npc_RunTimer()
        if (
    MODULE_GAMESERVER and self.nRegisterRunTimerIdthen
            Timer
    :Close(self.nRegisterRunTimerId);
            
    self.nRegisterRunTimerId    nil;
        
    end;
    end;

    -- 
    1. để xóa thời gian quy định chống NPC
    -- 2 phụ thuộc vào người chơi NPC khoảng cách từ con thứ hainếu khoảng cách thường được xóa
    --3. Mục tiêu là hoàn thành (và các cầu thủ đi))
    function 
    tb:OnRunTimer()
        if (
    not self.nMoveNpcIdthen
            self
    .nRegisterRunTimerId    nil;
            return 
    0;
        
    end
        
        local pFightNpc 
    KNpc.GetById(self.nMoveNpcId);
        if (
    not pFightNpcthen
            self
    .nRegisterRunTimerId    nil;
            return 
    0;
        
    end
        self
    .nRunElapseTime self.nRunElapseTime 1;
        if (
    self.nRunElapseTime self.nLimitTimethen -- Để thời gian quy địnhcác hộ tống thất bại
            pFightNpc
    .Delete();
            
    self.me.Msg("Không hộ tống thành công trong thời gian chỉ định"..self.szMoveNpcName..", quay về khởi điểm đối thoại lại để mở nhiệm vụ Hộ tống.")
            
    self.nMoveNpcId nil;
            
    self.nRegisterRunTimerId    nil;
            return 
    0;
        else
            
    local nHimCurMapIdnHimCurPosXnHimCurPosY pFightNpc.GetWorldPos();
            
    local oldme me;
            
    me self.me;
            
    local bAtPosszMsg    TaskCond:IsAtPos(self.nMapIdnHimCurPosXnHimCurPosYself.nMaxDistance);
            
    me oldme;
            if (
    not bAtPosthen
                pFightNpc
    .Delete();
                
    self.me.Msg("Khoảng cách hộ tống "..self.szMoveNpcName.."quá xa, nhiệm vụ thất bại, quay về đối thoại để mở nhiệm vụ Hộ tống.")
                
    self.nMoveNpcId nil;
                
    self.nRegisterRunTimerId    nil;
                return 
    0;
            
    end;

            
    local oldme me;
            
    me self.me;
            -- 
    Phân tích điểm đến
            
    if (TaskCond:IsNpcAtPos(35718562881097921) or pFightNpc.AI_IsArrival() == 1then
                self
    .bDone    =  1;
                
    self:ShareProtectNpc();
                
    local tbSaveTask    self.tbSaveTask;
                if (
    MODULE_GAMESERVER and tbSaveTaskthen    -- Đồng bộ tự cho khách hàngyêu cầu khách hàng để làm mới
                    self
    .me.SetTask(tbSaveTask.nGroupIdtbSaveTask.nStartTaskIdself.bDone1);
                    
    KTask.SendRefresh(self.meself.tbTask.nTaskIdself.tbTask.nReferIdtbSaveTask.nGroupId);
                
    end;
                
    pFightNpc.Delete();
                
    self.nMoveNpcId nil;
                
    self:UnReg_Npc_RunTimer();
                
    self.nRunElapseTime 0;
            
    end;
            
    me oldme;
            
            if (
    self:IsDone()) then    -- Một khi mục tiêu này đạt được sẽ không thất bại
                self
    .me.Msg("Mục tiêu:"..self:GetStaticDesc());
                
    self:UnReg_Npc_RunTimer();
                
    self:UnRegisterTalk();
                
    self.tbTask:OnFinishOneTag();
                
    self.nRunElapseTime 0;
                
    self.nRegisterRunTimerId    nil;
                return 
    0
            end
    ;
        
    end;
        
        return 
    self.REFRESH_FRAME;
    end;


    function 
    tb:ShareProtectNpc()
    --
    Qua tất cả các đồng đội của mình cho tất cả các nhiệm vụ bước mục tiêu hiện tạivà nếu mục tiêu này cũng giống như gọi OnTeamMateKillNpc
        local tbTeamMembers
    nMemberCount    self.me.GetTeamMemberList();
        if (
    not tbTeamMembersthen --Không thể chia sẻkhông có đội
            
    return;
        
    end
        
    if (nMemberCount <= 0then-- Không thể chia sẻkhông có thành viên trong nhóm
            
    return;
        
    end
        
        local nOldPlayerIndex 
    self.me.nPlayerIndex;
        for 
    1nMemberCount do
            
    local pPlayer    tbTeamMembers[i];
            if (
    pPlayer.nPlayerIndex ~= nOldPlayerIndexthen
                
    if (Task:AtNearDistance(pPlayerself.me) == 1then
                    
    for _tbTask in pairs(Task:GetPlayerTask(pPlayer).tbTasks) do
                        
                        for 
    _tbCurTag in pairs(tbTask.tbCurTags) do
                            
                            if (
    tbCurTag.szTargetName == self.szTargetNamethen
                                
    if (tbCurTag.nMoveNpcTempId == self.nMoveNpcTempId and
                                    (
    tbCurTag.nMapId == or tbCurTag.nMapId == self.nMapId)) then
                                    tbCurTag
    :OnTeamMateProtectNpc();
                                
    end
                            end
                        end
                    end
                end
            end
        end
    end
    ;


    function 
    tb:OnTeamMateProtectNpc()
        
    self.bDone  1;
        
    local tbSaveTask    self.tbSaveTask;
        if (
    MODULE_GAMESERVER and tbSaveTaskthen    -- Đồng bộ tự cho khách hàngyêu cầu khách hàng để làm mới
            self
    .me.SetTask(tbSaveTask.nGroupIdtbSaveTask.nStartTaskIdself.bDone1);
            
    KTask.SendRefresh(self.meself.tbTask.nTaskIdself.tbTask.nReferIdtbSaveTask.nGroupId);
        
    end;
        if (
    self:IsDone()) then    -- Một khi mục tiêu này đạt được sẽ không thất bại
            self
    .me.Msg("Mục tiêu:"..self:GetStaticDesc());
            
    self:UnReg_Npc_RunTimer();
            
    self:UnRegisterTalk();
            
    self.tbTask:OnFinishOneTag();
        
    end;
    end;


    function 
    tb:OnDeath()
        if (
    self:IsDone()) then
            
    return;
        
    end
        self
    .nMoveNpcId nil;
        
    self.me.Msg(self.szMoveNpcName.." đã chết, nhiệm vụ thất bại, quay về đối thoại để mở nhiệm vụ Hộ tống.");
    end 
    và đây là hàm e đang test nhưng vẫn chưa hoàn chinh
    e bị kẹt mấy cái id + tọa độ NPC hộ tống và địa điểm hoàn thành hộ tống
    nó kêu cái gì mà ''''''người chơi có thể để lại các điểm mục tiêu xa nhất phối x, y tọa độ của mục tiêu, mục tiêu bán kính, các tuyến đường'''''''''''
    e k học nên e k bit .. pro nào vào giúp đỡ đi ạ
    Khách viếng thăm hãy cùng hxhhxhz xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  4. #4
    Vi phạm quy định
    Ngày tham gia
    Mar 2014
    Bài viết
    365
    Thanks
    118
    Thanked 25 Times in 25 Posts

    Ðề: Xin Hướng Dẫn Về Hộ Tống

    Tạo 1 NPC nhận nhiệm vụ hộ tống ( chắc k thể k tạo dc )

    hình như cái này dựa vào Task gọi NPC
    Task tìm đường giống như auto tự tìm đường khi tìm k có 1 vật gì đó và nó tự đi theo 1 đường nhất định giống như mình kích chuột tự tìm đường ý
    Hàm Add npc với id npc id tọa độ x,y,r (r là cái gì e k bjt nữa) check bán kính .. ( e cũng bó tay) lever của NPC ( chỉ có Add npc mình mún hộ tống)
    Set task là gì e cũng k bjt mà nó cũng có
    hàm thỳ tùm lum mà e chả bit nó là hàm gì nữa .. hùi h chưa học gì về hàm cả
    Check kết thúc ( nơi hoàn thành hộ tống ) Add 1 NPC có sẵn rầu hàm gì mà tự check tọa độ khi nhân vật mình tới nơi đó thỳ có thể kích vào NPC mình đã add địa điểm khi nhân vật tới nơi để trả nhiệm vụ..
    Add phần thưởng vào NPc mình đã add để trả nhiệm vụ
    hàm kết thúc hộ tống ..
    PHP Code:
    function tb:OnTeamMateProtectNpc()
        
    self.bDone  1;
        
    local tbSaveTask    self.tbSaveTask;
        if (
    MODULE_GAMESERVER and tbSaveTaskthen    -- Đồng bộ tự cho khách hàngyêu cầu khách hàng để làm mới
            self
    .me.SetTask(tbSaveTask.nGroupIdtbSaveTask.nStartTaskIdself.bDone1);
            
    KTask.SendRefresh(self.meself.tbTask.nTaskIdself.tbTask.nReferIdtbSaveTask.nGroupId);
        
    end;
        if (
    self:IsDone()) then    -- Một khi mục tiêu này đạt được sẽ không thất bại
            self
    .me.Msg("Mục tiêu:"..self:GetStaticDesc());
            
    self:UnReg_Npc_RunTimer();
            
    self:UnRegisterTalk();
            
    self.tbTask:OnFinishOneTag();
        
    end;
    end
    hàm này là save task để có thể quay về nhận típ hộ tống ( hoàn thành nhiệm vụ )
    add hàm Đã hoàn thành hộ tống vào NPC nhận nhiệm vụ

    e k bjt gì hết nên nói vậy k bjt đúng hay trật nữa. . mấy pro vào thảo luận giúp đi ạ
    Khách viếng thăm hãy cùng hxhhxhz xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

 

 

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à 04:53 AM.
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ệ.