dp-s_doc/Start/Example/10.md

140 lines
4.3 KiB
Markdown
Raw Permalink Normal View History

2025-03-23 18:51:55 +08:00
## 任务清理券大全 (贡献者: 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 = [1244],如果不需要过滤任务直接传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");
```
> 至此一个简单的任务清理券大全的逻辑就写完了