## 任务清理券大全 (贡献者: X) > 首先我们先在dp_s文件夹中建立一个项目文件夹 MyProject 方便管理 ![Alt text](../../image/6.png) > 然后我们建立一个新文件 任务清理券大全.nut 用于编写我们的代码 ![Alt text](../../image/31.png) > 然后我们在任务清理券大全.nut中写入以下代码 ``` //使用本功能,需要群文件内233.dll插件,用来弹窗提示用户;如果不需要233插件,请将SUser.SendNotiBox("这里写提示文字",1);修改为:SUser.SendNotiPacketMessage("这里写提示文字", 8); //数字11111代表你的主线任务清理券在pvf中的id,下面同样,修改为你的pvf内的文件id即可。 //如有疑问 群内询问 //主线任务清理券 Cb_Use_Item_Sp_Func[2021458802] <- function(SUser, ItemId) { pdrw(SUser,ItemId,0,null); }; //支线/普通任务清理券(会清掉副职业/转职任务,这里添加了跳过副职业的任务ID) Cb_Use_Item_Sp_Func[11111] <- function(SUser, ItemId) { local QuestArray =[2702,2708,2710,2712]; pdrw(SUser,ItemId,5,QuestArray); }; //每日任务清理券 Cb_Use_Item_Sp_Func[22222] <- function(SUser, ItemId) { pdrw(SUser,ItemId,3,null); }; //成就任务清理券(会清掉觉醒任务,自行添加需要屏蔽的ID) Cb_Use_Item_Sp_Func[3333] <- function(SUser, ItemId) { pdrw(SUser,ItemId,2,null); }; //修炼任务清理券 Cb_Use_Item_Sp_Func[6666] <- function(SUser, ItemId) { pdrw(SUser,ItemId,1,null); }; //Tag:int型,传递一个标记来表示本次完成哪种类型的任务:(0=主线,5=普通/副职业/转职,1=修炼,3=每日/活动,2=觉醒/成就) //QuestArray:一个包含int型的数组,数组内是要过滤掉的任务ID。举例 local QuestArray = [12,44],如果不需要过滤任务,直接传null function pdrw(SUser, ItemId,Tag,QuestArray){ local QuestArray = QuestArray; //获取角色任务信息 local userQuest = SUser.GetQuest(); //当前角色已完成的任务 local questIsClear = NativePointer(userQuest).add(4); //获取角色等级 local characLevel = SUser.GetCharacLevel(); //统计要完成的任务数量 local allClearQuest = 0; //获取pvf数据 local DataManager = Sq_CallFunc(S_Ptr("0x80CC19B"), "pointer"); //清空已接任务 for(local i=0; i<20; i++) { local a = NativePointer(userQuest).add(4 * (i + 7500 + 2)).readInt(); SUser.ClearQuest_Gm(a); } //循环开始清理 for(local questID = 1; questID < 30000; questID++){ //判断下不需要自动完成的任务数组,包含就跳过 if(QuestArray!=null){ if(QuestArray.find(questID)!=null){continue;}; } //判断当前任务是否已经完成,questID=任务ID; local isClear = Sq_CallFunc(S_Ptr("0x808BAE0"),"bool",["pointer","int"],questIsClear.C_Object,questID); //此任务已清理,跳过 if(isClear){continue;}; //从pvf中获取任务数据 questID=任务ID local pvfQuest = Sq_CallFunc(S_Ptr("0x835FDC6"), "pointer", ["pointer", "int"],DataManager,questID ); if(pvfQuest){ //获取任务类型0=主线,5=普通/副职业/转职,1=修炼,3=每日/活动,2=觉醒/成就 local questGrade = NativePointer(pvfQuest).add(8).readInt(); if(questGrade == Tag){ //获取任务的级别 local questLv = NativePointer(pvfQuest).add(0x20).readInt(); if(questLv<=characLevel){ //将该任务设置为已完成状态 Sq_CallFunc(S_Ptr("0x808BA78"), "int", ["pointer", "int"], questIsClear.C_Object,questID); allClearQuest++; }; }; }; }; //已清理了0个以上的任务 if(allClearQuest>0){ //通知客户端刷新任务列表 local Pack = Packet(); Sq_CallFunc(S_Ptr("0x86ABBA8"), "int", ["pointer", "pointer"], userQuest, Pack.C_Object); SUser.Send(Pack); Pack.Delete(); SUser.SendNotiBox("已清理任务共 "+allClearQuest+" 个",1); }else{ SUser.SendNotiBox("无任务需要清理",1); SUser.GiveItem(ItemId, 1); } } ``` > 最后我们回到dp_s文件夹中,打开Main.nut 加载我们刚才编写的逻辑 ``` sq_RunScript("MyProject/任务清理券大全.nut"); ``` > 至此一个简单的任务清理券大全的逻辑就写完了