dp-s_doc/Start/Example/10.md

4.3 KiB
Raw Blame History

任务清理券大全 (贡献者: X)

首先我们先在dp_s文件夹中建立一个项目文件夹 MyProject 方便管理

Alt text

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

Alt text

然后我们在任务清理券大全.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");

至此一个简单的任务清理券大全的逻辑就写完了