$mysql_conf['host'], 'port' => $mysql_conf['port'], 'user' => $mysql_conf['user'], 'passwd' => $mysql_conf['passwd'], 'dbname' => DBNAME_PREFIX . $mysql_conf['instance_id'] )); return $conn; } protected function getQuest($quest_id) { $g_conf_quest_cluster = require('../res/task@task.php'); $quest_conf = getQuestConfig($g_conf_quest_cluster, $quest_id); $q = array( 'id' => $quest_conf['id'], 'type' => $quest_conf['type'], 'condition' => $quest_conf['condition'], 'value' => $quest_conf['value'], 'reward' => $quest_conf['reward'], ); return $q; } protected function getExplode($string) { $delim = "|"; $drop_multiply = explode($delim, $string); $delim1 = ":"; $arr = array(); for ($i = 0; $i < count($drop_multiply); $i++) { $mul = explode($delim1, $drop_multiply[$i]); array_push($arr, $mul); } return $arr; } public function triggerQuest($quest_id, $quest_type, $quest_num, $account_id) { $conn = $this->getMysql($account_id); if (!$conn) { phpcommon\sendError(ERR_USER_BASE + 1, '没有这个玩家'); return; } $q = $this->getQuest($quest_id); if (!$q) { phpcommon\sendError(ERR_USER_BASE + 2, '没有这个任务'); return; } $row = $conn->execQueryOne('SELECT * FROM quest WHERE accountid=:accountid AND quest_id =:quest_id AND quest_type=:quest_type;', array( ':accountid' => $account_id, ':quest_id' => $quest_id, ':quest_type' => $quest_type, )); if ($row) { if ($row['quest_state'] == 0) { if ($q['condition'] == 7 && $quest_type == 1) { if($quest_num <= $q['value']) { $quest_state = 1; $this->triggerQuest(QUEST_DAY_COMPLETE, 1, 1, $account_id); } } else if ($q['condition'] == 13 && $quest_type == 1){ if ($row['quest_num'] + $quest_num >= $q['value']) { $quest_num = $q['value']; $quest_state = 1; } else { $quest_num = $row['quest_num'] + $quest_num; $quest_state = 0; } } else { if ($row['quest_num'] + $quest_num >= $q['value']) { $quest_num = $q['value']; $quest_state = 1; if ($quest_type == 1) { $this->triggerQuest(QUEST_DAY_COMPLETE, 1, 1, $account_id); } } else { $quest_num = $row['quest_num'] + $quest_num; $quest_state = 0; } } $ret = $conn->execScript('UPDATE quest SET quest_num=:quest_num, quest_state=:quest_state, modify_time=:modify_time ' . ' WHERE accountid=:accountid AND quest_id =:quest_id AND quest_type=:quest_type;', array( ':accountid' => $account_id, ':quest_id' => $quest_id, ':quest_type' => $quest_type, ':quest_num' => $quest_num, ':quest_state' => $quest_state, ':modify_time' => phpcommon\getNowTime() )); if (!$ret) { die(); return; } } } else { $quest_state = 0; if ($q['condition'] == 7 && $quest_type == 1) { if($quest_num <= $q['value']) { $quest_state = 1; $this->triggerQuest(QUEST_DAY_COMPLETE, 1, 1, $account_id); } } else if ($q['condition'] == 13 && $quest_type == 1){ if ($row['quest_num'] >= $q['value']) { $quest_num = $q['value']; $quest_state = 1; } } else { if ($quest_num >= $q['value']) { $quest_num = $q['value']; $quest_state = 1; if ($quest_type == 1) { $this->triggerQuest(QUEST_DAY_COMPLETE, 1, 1, $account_id); } } } $this->insertTask($account_id, $quest_id, $quest_num, $quest_type, $quest_state); } //提交充值活动任务 $this->flushActQuest($quest_id, $quest_num, $account_id); } public function insertTask($account_id, $id, $num, $type, $status) { $conn = $this->getMysql($account_id); $ret = $conn->execScript('INSERT INTO quest(accountid, quest_id, quest_num, quest_type, quest_state, create_time, modify_time) ' . ' VALUES(:accountid, :quest_id, :quest_num, :quest_type, :quest_state, :create_time, :modify_time) ' . ' ON DUPLICATE KEY UPDATE accountid=:accountid, quest_id=:quest_id, quest_num=:quest_num, quest_type=:quest_type, quest_state=:quest_state, modify_time=:modify_time;', array( ':accountid' => $account_id, ':quest_id' => $id, ':quest_num' => $num, ':quest_type' => $type, ':quest_state'=> $status, ':create_time' => phpcommon\getNowTime(), ':modify_time' => phpcommon\getNowTime() )); if (!$ret) { die(); return; } } public function submitSeaQuest($quest_id, $quest_num, $account_id) { $conn = $this->getMysql($account_id); if (!$conn) { phpcommon\sendError(ERR_USER_BASE + 1, '没有这个玩家'); return; } $q = $this->getQuest($quest_id); if (!$q) { phpcommon\sendError(ERR_USER_BASE + 2, '没有这个任务'); return; } $rowuser = $conn->execQueryOne('SELECT score, daily_score, passcard FROM user WHERE accountid=:accountid;', array( ':accountid' => $account_id, )); $max_exp = metatable\getNowSeasoncardExp($rowuser['score']); if ($rowuser['passcard'] == 1) { $max_exp = floor($max_exp + $max_exp * metatable\getParameterByName('card_addexplimit') / 100); } if ($rowuser['daily_score'] >= $max_exp) { phpcommon\sendError(ERR_USER_BASE + 3, '今日任务已达上限'); return; } $row = $conn->execQueryOne('SELECT * FROM quest WHERE accountid=:accountid AND quest_id =:quest_id;', array( ':accountid' => $account_id, ':quest_id' => $quest_id, )); $reward_num = explode(':',$q['reward']); $exp = $reward_num[1]; $flag = 0; if (!$row) { $quest_state = 0; if ($q['condition'] == 7) { if($quest_num <= $q['value']) { $quest_state=2; $flag = 1; } } else { if ($quest_num >= $q['value']) { $quest_num = $quest_num - $q['value']; $quest_state=2; $flag = 1; } } $this->insertTask($account_id, $quest_id, $quest_num, $q['type'], $quest_state); } else { $quest_state = $row['quest_state']; if ($row['quest_state'] == 0) { if ($q['condition'] == 7) { if($quest_num <= $q['value']) { $quest_state = 2; $flag = 1; } } else { if ($quest_num + $row['quest_num'] >= $q['value']) { $quest_num = $quest_num + $row['quest_num'] - $q['value']; $quest_state = 2; $flag = 1; } } $ret = $conn->execScript('UPDATE quest SET quest_num=:quest_num, quest_state=:quest_state, modify_time=:modify_time ' . ' WHERE accountid=:accountid AND quest_id =:quest_id AND quest_type=:quest_type;', array( ':accountid' => $account_id, ':quest_id' => $quest_id, ':quest_type' => $q['type'], ':quest_num' => $quest_num, ':quest_state' => $quest_state, ':modify_time' => phpcommon\getNowTime() )); if (!$ret) { die(); return; } } } if ($flag == 1) { if ($exp + $rowuser['daily_score'] >= $max_exp) { $exp = $max_exp - $rowuser['daily_score']; } $ret = $conn->execScript('UPDATE user SET daily_score=:daily_score, score=:score, modify_time=:modify_time ' . ' WHERE accountid=:accountid;', array( ':accountid' => $account_id, ':daily_score' => $rowuser['daily_score'] + $exp, ':score' => $rowuser['score'] + $exp, ':modify_time' => phpcommon\getNowTime() )); if (!$ret) { die(); return; } } } public function flushActQuest($quest_id, $quest_num, $account_id) { $conn = $this->getMysql($account_id); if (!$conn) { return; } $user_db = $this->readRecActDB($account_id); if (!$user_db || empty($user_db)) { return; } $id = $quest_id - 71000; foreach ($user_db['quest_list'] as &$user) { if (isset($user['quest_list']) && !empty($user['quest_list'])) { foreach ($user['quest_list'] as &$us) { if ($us['id'] != $id || $us['status'] != 0) { continue; } $us['num'] = $us['num'] + $quest_num; if ($us['num'] >= $us['condition']) { $us['status'] = 1; } } } } $this->saveRecActDB($account_id, $user_db); } protected function readRecActDB($account_id) { $conn = $this->getMysql($account_id); $row = $conn->execQueryOne('SELECT blobdata FROM recharge_activity WHERE accountid=:accountid;', array( ':accountid' => $account_id )); if (!empty($row)) { $rec_db_str = $row['blobdata']; $rec_db = json_decode($rec_db_str, true); return $rec_db; } else { return null; } } protected function saveRecActDB($account_id, $rec_db) { $conn = $this->getMysql($account_id); $row = $conn->execQueryOne('SELECT accountid FROM recharge_activity WHERE accountid=:accountid;', array( ':accountid' => $account_id )); $rec_db_str = ""; if (!empty($rec_db)) { $rec_db_str = json_encode($rec_db); } if (!empty($row)) { //update $row = $conn->execScript('UPDATE recharge_activity SET blobdata=:blobdata, modify_time=:modify_time WHERE accountid=:accountid;', array( ':accountid' => $account_id, ':blobdata' => $rec_db_str, ':modify_time' => phpcommon\getNowTime() )); } else { //insert $row = $conn->execScript('INSERT INTO recharge_activity(accountid, blobdata, create_time, modify_time) ' . ' VALUES(:account_id, :blobdata, :create_time, :modify_time) ' . ' ON DUPLICATE KEY UPDATE accountid=:account_id, blobdata=:blobdata, modify_time=:modify_time;', array( ':account_id' => $account_id, ':blobdata' => $rec_db_str, ':create_time' => phpcommon\getNowTime(), ':modify_time' => phpcommon\getNowTime(), )); } } } ?>