关于任务的frida

var QUEST_GRADE_COMMON_UNIQUE = 5; //任务脚本中[grade]字段对应的常量定义 可以在importQuestScript函数中找到
var QUEST_GRADE_NORMALY_REPEAT = 4; //可重复提交的重复任务
var QUEST_GRADE_DAILY = 3; //每日任务
var QUEST_GRADE_EPIC = 0; //史诗任务
/**无条件完成指定任务并领取奖励 */
function api_force_clear_quest(user, quest_id){
//设置GM完成任务模式(无条件完成任务)
CUser_setGmQuestFlag(user, 1);

//接受任务
CUser_quest_action(user, 33, quest_id, 0, 0);

//完成任务
CUser_quest_action(user, 35, quest_id, 0, 0);

//领取任务奖励(倒数第二个参数表示领取奖励的编号, -1=领取不需要选择的奖励; 0=领取可选奖励中的第1个奖励; 1=领取可选奖励中的第二个奖励)
CUser_quest_action(user, 36, quest_id, -1, 1);

//服务端有反作弊机制: 任务完成时间间隔不能小于1秒. 这里将上次任务完成时间清零 可以连续提交任务
user.add(0x79644).writeInt(0);

//关闭GM完成任务模式(不需要材料直接完成)
CUser_setGmQuestFlag(user, 0);

return;
}

/**重置所有任务(需要小退重新选择角色刷新) */
function api_reset_all_quest(user){
var user_quest = CUser_getCurCharacQuestW(user);
//清空已接任务列表
for(var i=0; i<20; i++)
{
user_quest.add(4 * (i + 7500 + 2)).writeInt(0);
}
//所有任务设置未完成状态
for(var i=0; i<29999; i++)
{
WongWork_CQuestClear_resetClearedQuests(user_quest.add(4), i);
}

api_CUser_SendNotiPacketMessage(user, ‘所有任务已重置, 请重新选择角色刷新任务列表!’, 14);
}

/**完成当前已接任务并领取奖励 */
function clear_doing_quest(user){
//玩家任务信息
var user_quest = CUser_getCurCharacQuestW(user);

//遍历20个已接任务
//任务列表(保存任务id): user_quest.add(4 * (i + 7500 + 2))
//任务完成状态(0=已满足任务条件): user_quest.add(4 * (i + 7520 + 2))
for(var i=0; i<20; i++)
{
//任务id
var quest_id = user_quest.add(4 * (i + 7500 + 2)).readInt();

if(quest_id > 0)
{
//无条件完成任务并领取奖励
api_force_clear_quest(user, quest_id);
}
}

//通知客户端更新已完成任务列表
CUser_send_clear_quest_list(user);

//通知客户端更新任务列表
var packet_guard = api_PacketGuard_PacketGuard();
UserQuest_get_quest_info(user_quest, packet_guard);
CUser_Send(user, packet_guard);
Destroy_PacketGuard_PacketGuard(packet_guard);
}

/**任务完成券 完成角色当前可接的所有任务(仅发送金币/经验/QP等基础奖励 无道具奖励) */
function clear_all_quest_by_character_level(user){
//log(‘clear_all_quest_by_character_level start!’);

//玩家任务信息
var user_quest = CUser_getCurCharacQuestW(user);
//玩家已完成任务信息
var WongWork_CQuestClear = user_quest.add(4);
//玩家当前等级
var charac_lv = CUserCharacInfo_get_charac_level(user);

//本次完成任务数量
var clear_quest_cnt = 0;

//pvf数据
var data_manager = G_CDataManager();

//首先完成当前已接任务
clear_doing_quest(user);

//完成当前等级所有任务总经验奖励
var total_exp_bonus = 0;
//完成当前等级所有任务总金币奖励
var total_gold_bonus = 0;
//任务点奖励
var total_quest_point_bonus = 0;
var total_quest_piece_bonus = 0;

//任务最大编号: 29999
for(var quest_id=1; quest_id<30000; quest_id++)
{
//跳过已完成的任务
if(WongWork_CQuestClear_isClearedQuest(WongWork_CQuestClear, quest_id))
continue;

//获取任务数据
var quest = CDataManager_find_quest(data_manager, quest_id);
if(!quest.isNull())
{
//任务类型
var quest_grade = quest.add(8).readInt();

//跳过grade为[common unique]类型的任务(转职等任务)
//跳过可重复提交的任务
//跳过每日任务
if((quest_grade != QUEST_GRADE_COMMON_UNIQUE) && (quest_grade != QUEST_GRADE_NORMALY_REPEAT) && (quest_grade != QUEST_GRADE_DAILY))
{

//只判断任务最低等级要求 忽略 职业/前置 等任务要求 可一次性完成当前等级所有任务
var quest_min_lv = quest.add(0x20).readInt();
if(quest_min_lv <= charac_lv)
{
//获取该任务的基础奖励
var exp_bonus = Memory.alloc(4);
var gold_bonus = Memory.alloc(4);
var quest_point_bonus = Memory.alloc(4);
var quest_piece_bonus = Memory.alloc(4);
//QP奖励已直接发送到角色 经验/金币只返回结果 需要手动发送
CUser_quest_basic_reward(user,quest, exp_bonus, gold_bonus, quest_point_bonus, quest_piece_bonus, 1);

//统计本次自动完成任务的基础奖励
var exp = exp_bonus.readInt();
var gold = gold_bonus.readInt();
var quest_point = quest_point_bonus.readInt();
var quest_piece = quest_piece_bonus.readInt();
if(exp > 0)
total_exp_bonus += exp;
if(gold > 0)
total_gold_bonus += gold;
if(quest_point > 0)
total_quest_point_bonus += quest_point; //没有[quest point]字段的任务quest_point=10000
if(quest_piece > 0)
total_quest_piece_bonus += quest_piece;

//将该任务设置为已完成状态
WongWork_CQuestClear_setClearedQuest(user_quest.add(4), quest_id);

//本次自动完成任务计数
clear_quest_cnt++;
}
}
}
}

//通知客户端更新
if(clear_quest_cnt > 0)
{
//发送任务经验奖励
if(total_exp_bonus > 0)
api_CUser_gain_exp_sp(user, total_exp_bonus);
//发送任务金币奖励
if(total_gold_bonus > 0)
CInventory_gain_money(CUserCharacInfo_getCurCharacInvenW(user), total_gold_bonus, 0, 0, 0);

//通知客户端更新奖励数据
if ( CUser_get_state(user) == 3 )
{
CUser_SendNotiPacket(user, 0, 2, 0);
CUser_SendNotiPacket(user, 1, 2, 1);

CUser_SendUpdateItemList(user, 1, 0, 0);
CUser_sendCharacQp(user);
CUser_sendCharacQuestPiece(user);
}

//通知客户端更新已完成任务列表
CUser_send_clear_quest_list(user);

//通知客户端更新任务列表
var packet_guard = api_PacketGuard_PacketGuard();
UserQuest_get_quest_info(user_quest, packet_guard);
CUser_Send(user, packet_guard);
Destroy_PacketGuard_PacketGuard(packet_guard);

//公告通知客户端本次自动完成任务数据
api_CUser_SendNotiPacketMessage(user, ‘已自动完成当前等级任务数量: ‘ + clear_quest_cnt, 14);
api_CUser_SendNotiPacketMessage(user, ‘任务经验奖励: ‘ + total_exp_bonus, 14);
api_CUser_SendNotiPacketMessage(user, ‘任务金币奖励: ‘ + total_gold_bonus, 14);
api_CUser_SendNotiPacketMessage(user, ‘任务QuestPoint奖励: ‘ + total_quest_point_bonus, 14);
api_CUser_SendNotiPacketMessage(user, ‘任务QuestPiece奖励: ‘ + total_quest_piece_bonus, 14);
}

return;
}

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容