dp-s_doc/Start/Example/10.md

140 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 任务清理券大全 (贡献者: 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");
```
> 至此一个简单的任务清理券大全的逻辑就写完了