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