typeId); my_Assert(null != $mo, ErrCode::err_const_no); return $mo; } /** * @return int 计数最大值 */ public function max() { return $this->mo()->num; } /** * @return string[] 参数数组 */ private function paras() { return explode(',', $this->mo()->paras); } /** * @return float 当前进度 */ public function progress() { return $this->cur / $this->max(); } /** * 是否完成 * @return bool */ public function isFinish() { return $this->cur >= $this->max(); } /** * 构造函数 * @param type $args */ public function __construct($args) { if (isInt($args)) { $this->typeId = $args; } else { parent::__construct($args); } } /** * 检查任务条件(与petmini采用相同的参数和判定方法2020年12月12日11:38:02) * @param Ins_TaskEventArgs $taskCardEvent * @return bool */ public function check_new($taskCardEvent) { // var_dump($taskCardEvent); if ($this->isFinish()) { return true; } if ($taskCardEvent->taskType != $this->mo()->cmd) { # 事件类型匹配 return false; } if (strlen($this->mo()->paras) <= 0) { # 无参数 return true; } $paras = $this->paras(); $index = 0; foreach ($taskCardEvent->paras as $para) { if ($index < count($paras)) { if (strpos($para, "|") !== false) { # 某个条件是"或"的关系, 即有多重可能值, 满足其一即可 $paraList = explode("|", $para); foreach ($paraList as $paraItem) { if ($paraItem == $paras[$index]) { continue; # 满足某一个即可, 继续判断下一个条件. } } } else { # only one, 不存在"或"的判定 if ($paras[$index] != 0 && $para != $paras[$index]) { # 直接匹配 return false; # 一但没匹配上, 直接返回false就好了. } } } # 参数中多余的数据就直接跳过,不比较了(因为自己不需要判断那么多参数) $index++; } return true; # 走到最后则判定满足条件. } /** * 推进任务进度(采用和petmini相同的推进算法,2020年12月12日11:38:22) * @param Ins_TaskEventArgs $taskParam */ public function propel($taskParam) { // var_dump($taskParam); switch ($taskParam->ope) { case Enum_PropelType::set: $this->cur = $taskParam->val; break; case Enum_PropelType::add: $this->cur += $taskParam->val; break; case Enum_PropelType::inc: $this->cur += 1; break; case Enum_PropelType::max: if ($taskParam->val > $this->cur) { $this->cur = $taskParam->val; } break; } } }