140 lines
4.3 KiB
Markdown
140 lines
4.3 KiB
Markdown
## 任务清理券大全 (贡献者: X)
|
||
|
||
> 首先我们先在dp_s文件夹中建立一个项目文件夹 MyProject 方便管理
|
||
|
||

|
||
|
||
> 然后我们建立一个新文件 任务清理券大全.nut 用于编写我们的代码
|
||
|
||

|
||
|
||
> 然后我们在任务清理券大全.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");
|
||
```
|
||
|
||
> 至此一个简单的任务清理券大全的逻辑就写完了 |