333 lines
14 KiB
PHP
333 lines
14 KiB
PHP
<?php
|
|
|
|
namespace classes;
|
|
require_once 'metatable/seasoncard.php';
|
|
require_once 'metatable/parameter.php';
|
|
use phpcommon;
|
|
use metatable;
|
|
class Quest{
|
|
|
|
protected function getMysql($account_id)
|
|
{
|
|
$mysql_conf = getMysqlConfig(crc32($account_id));
|
|
$conn = new phpcommon\Mysql(array(
|
|
'host' => $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(),
|
|
));
|
|
}
|
|
}
|
|
}
|
|
?>
|