任务 - wolfcon/NGA-API-Documents GitHub Wiki

15 任务

15.1 获取任务信息

输入地址

/nuke.php?

输入参数

__lib //固定为 mission
__act //固定为 get
event //触发任务的事件ID  取值 1:签到事件
type //任务类型bit 取值 1:需要计数器的任务/2:可以重复完成的任务
available //是否只返回对用户有效(可完成)的任务 取值 1或0 (目前只能取1)
fid //任务限定的版面ID 不设为不限制 0为不属于特定版面的任务
tid //任务限定的主题ID 暂时未用
gid //任务限定的用户组ID 暂时未用
__output //输出格式 见1.1

提交后服务器会返回满足条件(event/type/available)的任务

论坛源码中对应

./nuke/lib_mission.php , lib_mission::__act_get()

返回信息

window.script_muti_get_var_store={
  "data":{
    "0":{
      "0":{
        "id":1, //任务ID
        "name":"测试任务", //任务名
        "info":"测试\n  任务信息", //任务的文字描述 可以使用bbscode
        "detail":"任务必须满足以下条件:\n\n\n
          任务可以获得以下奖励:\n
          道具:激活码/推荐码(1,1) x 2, 道具:行动力(2,1) x 1, 铜币:10, 声望:用户the_great_sea(7)的声望(-7) +100, 声望:德鲁伊(11) +100, \n\n
          任务只能完成一次\n\n", //任务的详细信息
        "stat":"目前已经连续签到0天\n共计签到0\n\n任务于 2014-04-11 18:11:48 完成\n\n" //当前用户的此任务完成状况
        "raw_detail":{}, //任务详细信息的原始格式 见15.2
        "stat_detail":{}, //完成状况的原始格式 见15.3
        }
      "1":.... //可能有多个
      }
    }
  ,
"time":1397451364
}

15.2 任务详细信息的原始格式

array(
lib_mission::__MD_ID =>123, #id
lib_mission::__MD_NAME => '任务名',
lib_mission::__MD_INFO => '任务信息 可以使用bbscode 不要有换行',
lib_mission::__MD_COND_AND => array( #必需满足的条件
  array(lib_mission::_COND_SINGIN_CONTINUE , 123), #全局连续签到时间
  array(lib_mission::_COND_SINGIN_SUM , 123), #全局总和签到时间
  array(lib_mission::_COND_COUNTER_SINGIN_CONTINUE , 123),#任务计数器的连续签到时间
  array(lib_mission::_COND_COUNTER_SINGIN_SUM , 123),#任务计数器的总和签到时间
  ),
lib_mission::__MD_COND_OR => array( #只需满足一个的条件 结构同上
  array(lib_mission::_COND_USER_ACTIVE_EQUAL , 1),//激活状态等于(如果用户激活级别1以上全视为1)
  array(lib_mission::_COND_MUST_CLIENT , 1),//必须是认证的客户端
  array(lib_mission::_COND_GOLD , minValue),//铜币大于等于
  array(lib_mission::_COND_REPUTATION , rid, minValue),//声望大于等于
  ),
lib_mission::__MD_FILTER_AND =>array(#显示任务必需满足的条件 结构同上 (选择available任务前检查
  
  ),
lib_mission::__MD_FILTER_OR =>array(#显示任务只需满足一个的条件 结构同上(选择available任务前检查
  
  ),
lib_mission::__MD_TYPE => _TYPE_SIGNIN_COUNTER|_TYPE_REPEAT|..., #任务类型bit
lib_mission::__MD_COOLDOWN_DAYS => 123, #重复完成的时间间隔 大于等于天
lib_mission::__MD_EVENT => _EVENT_SIGNIN/..., #触发任务完成的事件类型

lib_mission::__MD_REWARD_FIX => array(
  lib_mission::_REWARD_ITEM => array( #道具类任务奖励
    array(#道具1
      lib_mission::_ITEM_TYPE=>123, #道具的type
      lib_mission::_ITEM_SUB_TYPE => 123, #道具的sub_type
      lib_mission::_ITEM_COUNT=> 123, #奖励道具的数量
      ),
    array(#道具2
      lib_mission::_ITEM_TYPE=>123,
      lib_mission::_ITEM_SUB_TYPE => 123,
      lib_mission::_ITEM_COUNT=> 123,
      ),...
    ),
  lib_mission::_REWARD_CODE => array( #奖品码类任务奖励
    array(#奖品码1
      lib_mission::_CODE_INFO=>123, //奖品码的说明
      ),
    array(#奖品码2
      lib_mission::_CODE_INFO=>123, //奖品码的说明
      ),...
    ),
  lib_mission::_REWARD_GOLD => 123,#任务奖励 铜币数
  lib_mission::_REWARD_REPUTATION => array(#任务奖励 声望
    声望id => 声望值,
    ...
    ),
  ),

lib_mission::__MD_REWARD_RANDOM => array( #随机奖励
  123=>array( #随机组1 key为权重 随机计算方式为 srand(1,权重1+权重2+权重3...) 然后检查结果落在哪个权重范围内
    ... #随机组内结构与固定奖励相同
    ),
  234=>array( #随机组2
    
    ),
  ...
  )

lib_mission::__MD_FILTER_AND => 16,//同cond
lib_mission::__MD_FILTER_OR => 17,

lib_mission::__MD_COST_FIX => 18,//同reward
lib_mission::__MD_COST_RANDOM => 19,

lib_mission::__MD_END_TIME =>123,#任务的结束时间 不设为无限
lib_mission::__MD_FID =>123,//过滤条件
lib_mission::__MD_TID =>123,//过滤条件  
lib_mission::__MD_GID =>123,//过滤条件  
lib_mission::__MD_MANUAL_COUNT_GROUP =>123,//如果任务是用户手动请求计数 那么在用户请求某任务计数的时候 客户端应该自动请求相同group的任务计数
lib_mission::__MD_COUNTER_TYPE =>lib_mission::_COUNTER_SIGNIN #计数器类型
);

//其中用到的key
const __MD_ID = 1;
const __MD_COND_AND = 2;
const __MD_COND_OR = 3;
  #key of mission data array __MD_COND
  const _COND_SINGIN_CONTINUE = 1;//不要用这个
  const _COND_SINGIN_SUM = 2;//不要用这个
  const _COND_COUNTER_SINGIN_CONTINUE = 3;//任务计数器连续签到
  const _COND_COUNTER_SINGIN_SUM = 4;//任务计数器总签到
  const _COND_USER_ACTIVE_EQUAL = 5;//激活状态等于(如果用户激活级别1以上全视为1)
  const _COND_MUST_CLIENT = 6;//必须是认证的客户端
  const _COND_GOLD = 7;//铜币大于等于
  const _COND_REPUTATION = 8;//声望大于等于
  const _COND_COUNTER_TOPIC_SHARE_LEAST = 9; // 任务计数器,至少分享主题的数量
  const _COND_COUNTER_BUILD_TEAM_LEAST = 10; // 任务计数器,至少访问寻求组队的次数
  const _COND_GOLD_LESS = 11;//铜币小于等于
  const _COND_REGDATE_LESS = 12;//注册时间小于
  const _COND_REGDATE_GREAT = 13;//注册时间大于
  const _COND_TOPIC_GREAT = 14;//1时间之后的主题数大于等于2
  const _COND_COUNTER_CUSTOM_SUPPORT = 15; // 任务计数器,某特定活动计数 由服务器通过接口__act_server_custom_task_count_v0_add发送计数数据触发
const __MD_TYPE = 4;//类型bit 用于select任务时过滤
  const _TYPE_COUNTER = 1;#需要计数的任务
  const _TYPE_REPEAT = 2;#可以重复完成的任务
  const _TYPE_ACTIVE = 4;#必须用户级别激活级别1或更高
  const _TYPE_NOACTIVE = 8;#必须用户激活级别0
  const _TYPE_CLIENT = 16;#必须是认证的客户端
  const _TYPE_HIDE_COND = 32;#不公开任务条件
  const _TYPE_AUTO_CHECK = 64;#客户端在获取到available任务时应自动检查__act_check_mission任务是否完成
  const _TYPE_MANUAL_CHECK = 128;#客户端在获取到available任务后 应由用户自己操作检查任务是否完成
const __MD_COOLDOWN_DAYS = 5;
const __MD_EVENT = 6;#触发任务的事件
  const _EVENT_SIGNIN = 1; #签到事件
  const _EVENT_TOPIC_SHARE = 2; # 主题分享事件
  const _EVENT_BUILD_TEAM = 3; # 组队事件
  const _EVENT_CUSTOM_SUPPORT = 4; # 组队事件
const __MD_NAME = 9;
const __MD_INFO = 10;
const __MD_END_TIME = 11;
const __MD_FID = 12;//任务所属fid 用于select任务时过滤
const __MD_TID = 13;//任务所属tid 用于select任务时过滤
const __MD_GID = 14;//任务所属用户组id 用于select任务时过滤
const __MD_REWARD_FIX = 7;
const __MD_REWARD_RANDOM = 8;
  #key of __MD_REWARD_FIX element
  const _REWARD_ITEM = 1;#任务奖励 道具 array(item1, item2, ...)
    #key of __MD_REWARD_ITEM element
    const _ITEM_TYPE=0;
    const _ITEM_SUB_TYPE=1;
    const _ITEM_COUNT=2;
  const _REWARD_GOLD = 2;#任务奖励 铜币数
  const _REWARD_REPUTATION = 3;#任务奖励 声望
  const _REWARD_CODE = 4;#任务奖励 任意奖品码
    const _CODE_ITEM_ID = 0;#奖品码的占位item id 每种奖品必须不同 必须是type4 subtype1(奖品码储存在pw_items_code count字段必须为0
    const _CODE_REWARD_COOLDOWN_LIMIT = 1;#奖品码发放的cooldown时间(秒<3600 前一次获奖的cooldown时间内中奖用户无法再次获奖
    const _CODE_REWARD_USER_LIMIT = 2;//每个用户只能获得一个码
    const _CODE_INFO = 3;//奖品码的说明 可能为空
    const _CODE_REWARD_COOLDOWN_RANGE = 4;#奖品码发放的cooldown时段(秒<86400 此时段内只能有人获得一次奖品
  const _REWARD_178_API = 5;#任务奖励 接口发送积分
  const _REWARD_ACTIVE = 6;#任务奖励 生成一个激活接口使用的验证码
const __MD_COUNTER_TYPE = 15;
  const _COUNTER_SIGNIN= 1;#计数器类型 签到
  const _COUNTER_TOPIC_SHARE = 2; # 计数器类型  主题分享 对应_COND_COUNTER_TOPIC_SHARE_LEAST
  const _COUNTER_BUILD_TEAM = 3; # 计数器类型  组队 对应_COND_COUNTER_BUILD_TEAM_LEAST
  const _COUNTER_CUSTOM_SUPPORT = 4; # 计数器类型  对应_COND_COUNTER_CUSTOM_SUPPORT

const __MD_FILTER_AND = 16;//同cond
const __MD_FILTER_OR = 17;

const __MD_COST_FIX = 18;//同reward
const __MD_COST_RANDOM = 19;

const __MD_MANUAL_COUNT_GROUP = 20; //如果任务是用户手动请求计数 那么在用户请求某任务计数的时候 客户端应该自动请求相同group的任务计数
const __MD_ORDER = 21;//排序权重 小的在前
const __MD_START_TIME = 22;//任务起始时间 未到时间的应不显示

15.3 完成状况的原始格式

array(
  lib_mission::__STAT_CHECK_IN_C=>123, //连续签到次数
  lib_mission::__STAT_CHECK_IN_S=>123, //总签到次数
  lib_mission::__STAT_COMPLETE_TIME=>123, //任务完成的时间
  ....
  )

const __STAT_CHECK_IN_C = 1;//连续签到次数 对应_COUNTER_SIGNIN
const __STAT_CHECK_IN_S = 2;//总签到次数 对应_COUNTER_SIGNIN
const __STAT_COMPLETE_TIME = 3;//任务完成的时间 对应_COUNTER_*
const __STAT_DONE_TIME = 4; # 任务最后一次计数时间
const __STAT_CUSTOM_COUNTER = 5; # 任务计数值 对应_COUNTER_CUSTOM_SUPPORT

15.4 检查特定的任务

输入地址

/nuke.php?

输入参数

__lib //固定为 mission
__act //固定为 check_mission
mid //任务的id
no_complete //=1 时检查任务时不会自动完成任务
__output //输出格式 见1.1

提交后服务器会检查是否能完成特定id的任务 如能完成会完成之

论坛源码中对应

./nuke/lib_mission.php , lib_mission::__act_check_mission()

返回信息

window.script_muti_get_var_store={
  "data":{
    0:{
      "0":{//如果用户有可能完成任务 但是目前不满足完成条件 , 任务信息在这里
        "0":{
          "id":1, //任务ID
          "name":"测试任务", //任务名
          "info":"测试\n  任务信息", //任务的文字描述 可以使用bbscode
          "detail":"任务必须满足以下条件:\n\n\n
            任务可以获得以下奖励:\n
            道具:激活码/推荐码(1,1) x 2, 道具:行动力(2,1) x 1, 铜币:10, 声望:用户the_great_sea(7)的声望(-7) +100, 声望:德鲁伊(11) +100, \n\n
            任务只能完成一次\n\n", //任务的详细信息
          "stat":"目前已经连续签到0天\n共计签到0\n\n任务于 2014-04-11 18:11:48 完成\n\n" //当前用户的此任务完成状况
          "raw_detail":{}, //任务详细信息的原始格式 见15.2
          "stat_detail":{}, //完成状况的原始格式 见15.3
          }
        
        }
      "1":{//如果本次检查中完成了任务 , 任务信息在这里 , 如果设置了no_complete则为达成完成条件的任务信息
        "0":{
          "id":1, //任务ID
          "name":"测试任务", //任务名
          "info":"测试\n  任务信息", //任务的文字描述 可以使用bbscode
          "detail":"任务必须满足以下条件:\n\n\n
            任务可以获得以下奖励:\n
            道具:激活码/推荐码(1,1) x 2, 道具:行动力(2,1) x 1, 铜币:10, 声望:用户the_great_sea(7)的声望(-7) +100, 声望:德鲁伊(11) +100, \n\n
            任务只能完成一次\n\n", //任务的详细信息
          "stat":"目前已经连续签到0天\n共计签到0\n\n任务于 2014-04-11 18:11:48 完成\n\n" //当前用户的此任务完成状况
          "raw_detail":{}, //任务详细信息的原始格式 见15.2
          "stat_detail":{}, //完成状况的原始格式 见15.3
          }
        
        }
      "2":'vfervgrfed' //如果完成了任务 获得的奖励的文字描述 , 如果设置了no_complete则不会有这个
      "3":'bgfrtsbgtfrrgbtrfd' //额外的文字提示 可能有也可能没有
      }
    }
  ,
"time":1397451364
}

15.5 签到类任务单独计数

输入地址

/nuke.php?

输入参数

__lib //固定为 mission
__act //固定为 checkin_count_add
mid //任务ID
no_complete//=1 检查任务时不会自动完成任务
__output //输出格式 见1.1

只对 self::__MD_EVENT => self::_EVENT_SIGNIN, self::__MD_TYPE=>self::_TYPE_COUNTER, 类的任务有效

提交后服务器会返回是否计数(签到)成功

计数后会自动进行15.4的任务检查

如果有计数后完成的任务则会返回成功信息

论坛源码中对应

./nuke/lib_mission.php , lib_mission::__act_checkin_count_add()

返回信息

window.script_muti_get_var_store={
  "data":{
    "0":{//计数结果
      任务id1  :  7, //7表示 “今天已经签到了”
      任务id2  :  null,//空 或者不是数字都表示计数成功
      .... //可能有多个
      }
    1:{//完成的任务的成功信息
      ... //结构见15.4中相同部分
      }
    }
  ,
"time":1397451364
}

15.6 任务列表显示流程

  1. 通过接口15.1获得对当前用户可用(available)的任务信息

  2. 列表显示任务   其中任务类型为_TYPE_AUTO_CHECK的任务应自动通过接口15.4尝试完成   其中任务类型为_TYPE_MANUAL_CHECK应显示“提交任务”按钮 用户点击时通过接口15.4尝试完成   其中任务类型为_TYPE_MANUAL_CHECK并且计数器类型为_COUNTER_SIGNIN的任务应显示“签到”按钮 用户点击时通过接口15.5签到并尝试完成   具有相同__MD_MANUAL_COUNT_GROUP的任务 在自动或用户对其中一个进行操作时 其他的也应进行同样操作