-- ����ڧ�ѧߧڧ� �٧ѧէѧߧڧ� local function _script_dir() local src = debug.getinfo(1, "S").source if type(src) ~= "string" then return "" end if src:sub(1, 1) == "@" then src = src:sub(2) end src = src:gsub("\\", "/") local dir = src:match("^(.*)/") if dir == nil then return "" end return dir .. "/" end local function _dofile_rel(name) return dofile(_script_dir() .. name) end local pet_store = _dofile_rel("pet_role_store.lua") local function _pet_get(RoleID) if pet_store.schemaReady() then return pet_store.getRole(RoleID) or pet_store.legacyGet(RoleID) end return pet_store.legacyGet(RoleID) end local function _pet_set(RoleID, patch) if pet_store.schemaReady() then return pet_store.setRole(RoleID, patch) end return pet_store.legacySet(RoleID, patch) end local function _msg_params(RoleID, textMsgId, p1, p2, p3) local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 13, 1) msg.AddMsgEvent(MsgID, 1, textMsgId) if p1 ~= nil then msg.AddMsgEvent(MsgID, 9, p1) end if p2 ~= nil then msg.AddMsgEvent(MsgID, 9, p2) end if p3 ~= nil then msg.AddMsgEvent(MsgID, 9, p3) end msg.DispatchRoleMsgEvent(RoleID, MsgID) end -- How many times per day a player can complete/take this guild order quest. -- 0 = unlimited per day (multi-run daily). local Pet_f1_QuestNum = 1 Quest_Pet_f1 = {} -- ���ҧ���ߧ��� �ܧӧ֧��� Quest_Pet_f1[1] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602105, Num1 = 3, TargetID2 = 4100301, Num2 = 3, RewItemID1 = 4820047, value1 = 5, RewItemID2 = 6602118, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[2] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602105, Num1 = 3, TargetID2 = 6601163, Num2 = 3, RewItemID1 = 4999004, value1 = 3, RewItemID2 = 6602118, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[3] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602105, Num1 = 3, TargetID2 = 4100201, Num2 = 3, RewItemID1 = 4999005, value1 = 1, RewItemID2 = 6602118, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[4] = {TargetType = QuestTargetType["Collect"], TargetID1 = 4100201, Num1 = 3, TargetID2 = 6601163, Num2 = 3, RewItemID1 = 3060063, value1 = 30, RewItemID2 = 6602118, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[5] = {TargetType = QuestTargetType["Collect"], TargetID1 = 4100201, Num1 = 3, TargetID2 = 4100301, Num2 = 3, RewItemID1 = 3050085, value1 = 5, RewItemID2 = 6602118, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[6] = {TargetType = QuestTargetType["Collect"], TargetID1 = 4100301, Num1 = 3, TargetID2 = 6601163, Num2 = 3, RewItemID1 = 4400024, value1 = 1, RewItemID2 = 6602118, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[7] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602105, Num1 = 3, TargetID2 = 4100202, Num2 = 3, RewItemID1 = 5802664, value1 = 1, RewItemID2 = 6602118, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[8] = {TargetType = QuestTargetType["Collect"], TargetID1 = 4100202, Num1 = 3, TargetID2 = 6601163, Num2 = 3, RewItemID1 = 5802624, value1 = 1, RewItemID2 = 6602118, value2 = 1, RewMoney = 0, RewXP = 0} -- ���֧էܧڧ� Quest_Pet_f1[9] = {TargetType = QuestTargetType["Collect"], TargetID1 = 4100301, Num1 = 3, TargetID2 = 4100202, Num2 = 3, RewItemID1 = 4820084, value1 = 1, RewItemID2 = 6602119, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[10] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6601164, Num1 = 3, TargetID2 = 6602105, Num2 = 3, RewItemID1 = 3060064, value1 = 20, RewItemID2 = 6602119, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[11] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602106, Num1 = 3, TargetID2 = 4100203, Num2 = 3, RewItemID1 = 4820255, value1 = 1, RewItemID2 = 6602119, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[12] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602106, Num1 = 3, TargetID2 = 4100301, Num2 = 3, RewItemID1 = 4530243, value1 = 1, RewItemID2 = 6602119, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[13] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602106, Num1 = 3, TargetID2 = 6601164, Num2 = 3, RewItemID1 = 3020013, value1 = 1, RewItemID2 = 6602119, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[14] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6601164, Num1 = 3, TargetID2 = 4100203, Num2 = 3, RewItemID1 = 3020137, value1 = 1, RewItemID2 = 6602119, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[15] = {TargetType = QuestTargetType["Collect"], TargetID1 = 4100204, Num1 = 3, TargetID2 = 6601165, Num2 = 3, RewItemID1 = 3020138, value1 = 1, RewItemID2 = 6602119, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[16] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6601165, Num1 = 3, TargetID2 = 6602106, Num2 = 3, RewItemID1 = 6602220, value1 = 1, RewItemID2 = 6602119, value2 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[17] = {TargetType = QuestTargetType["Collect"], TargetID1 = 4100302, Num1 = 3, TargetID2 = 6602106, Num2 = 3, RewItemID1 = 6602223, value1 = 1, RewItemID2 = 6602119, value2 = 1, RewMoney = 0, RewXP = 0} -- ����ڧ�֧�ܧڧ� Quest_Pet_f1[18] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602102, Num1 = 1, TargetID2 = 4100302, Num2 = 5, RewItemID1 = 4810109, value1 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[19] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602103, Num1 = 1, TargetID2 = 4100206, Num2 = 5, RewItemID1 = 5802664, value1 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[20] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602104, Num1 = 1, TargetID2 = 6601165, Num2 = 5, RewItemID1 = 5802624, value1 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[21] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602102, Num1 = 1, TargetID2 = 4100207, Num2 = 5, RewItemID1 = 3020141, value1 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[22] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602103, Num1 = 1, TargetID2 = 6601166, Num2 = 5, RewItemID1 = 4820180, value1 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[23] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602104, Num1 = 1, TargetID2 = 4100303, Num2 = 5, RewItemID1 = 4820161, value1 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[24] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602102, Num1 = 1, TargetID2 = 4100210, Num2 = 10, RewItemID1 = 4820141, value1 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[25] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602103, Num1 = 1, TargetID2 = 4100304, Num2 = 5, RewItemID1 = 4810109, value1 = 1, RewMoney = 0, RewXP = 0} Quest_Pet_f1[26] = {TargetType = QuestTargetType["Collect"], TargetID1 = 6602104, Num1 = 1, TargetID2 = 6601167, Num2 = 20, RewItemID1 = 4820253, value1 = 1, RewMoney = 0, RewXP = 0} -- ����ڧߧ��ڧ� �٧ѧէѧߧڧ� function q52136_OnQuestInit(MapID, InstanceID, QuestID, RoleID, NPCID) local pr = _pet_get(RoleID) or {} local rolelevel = role.GetRoleLevel(MapID, InstanceID, RoleID) -- Guild level (1..3). If nil/0, initialize to level 1 to avoid empty quest index. local zero = tonumber(pr.zakazGi) or 0 if zero <= 0 then zero = 1 _pet_set(RoleID, { zakazGi = 1 }) end local Index = 1 local p1 = math.random(1, 8) -- common local p2 = math.random(9, 17) -- rare local p3 = math.random(18, 26) -- epic if rolelevel > 100 then rolelevel = 100 end if zero == 1 then Index = p1 elseif zero == 2 then Index = p2 else Index = p3 end -- Safety: ensure selected quest template exists (never call GetRandQuestTable with nil/0 index). if Quest_Pet_f1[Index] == nil then for i = 1, 26 do if Quest_Pet_f1[i] ~= nil then Index = i break end end end role.QuestInit(RoleID, QuestID, GetRandQuestTable(Quest_Pet_f1, Index)) end -- Accept hook (needed for some clients/NPC dialogs to show accept/complete options reliably) function q52136_OnAccept(MapID, InstanceID, QuestID, RoleID, NPCID) -- Ensure the role has initialized guild state so the first dialog/quest init works cleanly. local pr = _pet_get(RoleID) if (pr.zakazGi or 0) == 0 then _pet_set(RoleID, { zakazGi = 1 }) end if (pr.petf1Level or 0) == 0 then _pet_set(RoleID, { petf1Level = 1, petf2Level = 1, petf3Level = 1 }) end end -- ���ѧӧ֧��֧ߧڧ� �٧ѧէѧߧڧ� function q52136_OnComplete(MapID, InstanceID, QuestID, RoleID, NPCID) local pr = _pet_get(RoleID) local exp_quest = pr.zakazExp local lvl_quest = pr.zakazGi local num1 = role.GetRoleItemNum(RoleID, 6602118) local num2 = role.GetRoleItemNum(RoleID, 6602119) local gained = 0 if num1 >= 1 and lvl_quest <= 2 then gained = 1000 * num1 exp_quest = exp_quest + gained _pet_set(RoleID, { zakazExp = exp_quest }) role.RemoveFromRole(MapID, InstanceID, RoleID, 6602118, num1, 101) elseif num2 >= 1 and lvl_quest <= 2 then gained = 1500 * num2 exp_quest = exp_quest + gained _pet_set(RoleID, { zakazExp = exp_quest }) role.RemoveFromRole(MapID, InstanceID, RoleID, 6602119, num2, 101) end -- Notify player about guild exp credit (and fix level-up checks to use the updated exp_quest). if gained > 0 then local need = 0 if lvl_quest == 1 then need = 20000 elseif lvl_quest == 2 then need = 60000 elseif lvl_quest == 3 then need = 80000 end if lvl_quest == 1 and exp_quest >= 20000 then -- Reached level 2 _msg_params(RoleID, 952001, gained, 0, lvl_quest) lvl_quest = 2 exp_quest = 0 _pet_set(RoleID, { zakazGi = lvl_quest, zakazExp = exp_quest }) _msg_params(RoleID, 952002, lvl_quest) elseif lvl_quest == 2 and exp_quest >= 60000 then -- Reached level 3 _msg_params(RoleID, 952001, gained, 0, lvl_quest) lvl_quest = 3 exp_quest = 0 _pet_set(RoleID, { zakazGi = lvl_quest, zakazExp = exp_quest }) _msg_params(RoleID, 952002, lvl_quest) else local remaining = need - exp_quest if remaining < 0 then remaining = 0 end _msg_params(RoleID, 952001, gained, remaining, lvl_quest) end end -- Count completions per day in petStep (for multi-run daily). local CurTime = tonumber(os.date("%j")) local pr2 = _pet_get(RoleID) local Step = pr2.petStep or 0 local UpdateTime = pr2.petUpdate or 0 if CurTime ~= UpdateTime then Step = 0 end Step = Step + 1 if role.IsRoleHaveQuest(MapID, InstanceID, RoleID, 30792) then local Step2 = _pet_get(RoleID).petStepQixu Step2 = Step2 + 1 _pet_set(RoleID, { petStepQixu = Step2 }) if Step2 >= 5 then role.ModSpecialTargetValue(MapID, InstanceID, RoleID, 30792, 2) end end -- Persist daily counter + day marker _pet_set(RoleID, { petStep = Step, petUpdate = CurTime }) if role.GetTrialState(RoleID, 4016) == 1 then role.SetTrialCompleteNum(RoleID, 4016, role.GetTrialCompleteNum(RoleID, 4016) + 1) end if role.GetTrialState(RoleID, 4016) == 1 and role.GetTrialCompleteNum(RoleID, 4016) >= Trail_maxnum[4016] then role.TrialComplete(RoleID, 4016) end if role.GetTrialState(RoleID, 4017) == 1 then role.SetTrialCompleteNum(RoleID, 4017, role.GetTrialCompleteNum(RoleID, 4017) + 1) end if role.GetTrialState(RoleID, 4017) == 1 and role.GetTrialCompleteNum(RoleID, 4017) >= Trail_maxnum[4017] then role.TrialComplete(RoleID, 4017) end end function q52136_OnCheckAccept(MapID, InstanceID, QuestID, RoleID, NPCID) local pr = _pet_get(RoleID) local Step = pr.petStep or 0 local UpdateTime = pr.petUpdate or 0 local CurTime = tonumber(os.date("%j")) -- Reset daily counter when the day changes if CurTime ~= UpdateTime then Step = 0 _pet_set(RoleID, { petUpdate = CurTime, petStep = 0 }) end -- Unlimited per day if Pet_f1_QuestNum == 0 then return 1 end -- Limited per day if Step < Pet_f1_QuestNum then return 1 end local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 26, 401001) -- "можете взять квест только завтра" (reused) msg.DispatchRoleMsgEvent(RoleID, MsgID) return 0 end -- ����ܧѧ� ��� �٧ѧէѧߧڧ� function q52136_OnCancel(MapID, InstanceID, QuestID, RoleID) -- Allow cancelling without consuming daily runs. -- No state changes needed here. end aux.RegisterQuestEvent(52136, 2, "q52136_OnCancel") aux.RegisterQuestEvent(52136, 1, "q52136_OnComplete") aux.RegisterQuestEvent(52136, 0, "q52136_OnAccept") aux.RegisterQuestEvent(52136, 7, "q52136_OnQuestInit") aux.RegisterQuestEvent(52136, 4, "q52136_OnCheckAccept")