aozhiwei 0ec41feaa2 1
2020-12-08 19:50:53 +08:00

251 lines
10 KiB
PHP

<?php
namespace classes;
use phpcommon;
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'],
);
return $q;
}
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' => time()
));
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);
}
}
}
$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' => $quest_id,
':quest_num' => $quest_num,
':quest_type' => $quest_type,
':quest_state'=> $quest_state,
':create_time' => time(),
':modify_time' => time()
));
if (!$ret) {
die();
return;
}
}
}
//提交假日活动任务
public function flushHolidayQuest($quest_id, $quest_num, $account_id)
{
$conn = $this->getMysql($account_id);
if (!$conn) {
return;
}
$user_db = $this->readHolidayDB($account_id);
if (!$user_db || empty($user_db)) {
return;
}
$id = $quest_id;
$flag = 0;
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;
}
if ($id == 72009) {
if($quest_num <= $us['condition']) {
$us['status'] = 1;
$flag = 1;
}
} else {
$us['num'] = $us['num'] + $quest_num;
if ($us['num'] >= $us['condition']) {
$us['status'] = 1;
$flag = 1;
}
}
}
}
}
$this->saveHolidayDB($account_id, $user_db);
if ($flag == 1 && $id != 72010) {
$this->flushAllQuest($account_id);
}
}
public function flushAllQuest($account_id)
{
$conn = $this->getMysql($account_id);
if (!$conn) {
return;
}
$user_db = $this->readHolidayDB($account_id);
if (!$user_db || empty($user_db)) {
return;
}
$id = 72010;
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'] + 1;
if ($us['num'] >= $us['condition']) {
$us['status'] = 1;
}
}
}
}
$this->saveHolidayDB($account_id, $user_db);
}
protected function readHolidayDB($account_id) {
$conn = $this->getMysql($account_id);
$row = $conn->execQueryOne('SELECT blobdata FROM holiday WHERE accountid=:accountid;',
array(
':accountid' => $account_id
));
if (!empty($row)) {
$hol_db_str = $row['blobdata'];
$hol_db = json_decode($hol_db_str, true);
return $hol_db;
} else {
return null;
}
}
protected function saveHolidayDB($account_id, $hol_db) {
$conn = $this->getMysql($account_id);
$row = $conn->execQueryOne('SELECT accountid FROM holiday WHERE accountid=:accountid;',
array(
':accountid' => $account_id
));
$hol_db_str = "";
if (!empty($hol_db)) {
$hol_db_str = json_encode($hol_db);
}
if (!empty($row)) {
//update
$row = $conn->execScript('UPDATE holiday SET blobdata=:blobdata, modify_time=:modify_time WHERE accountid=:accountid;',
array(
':accountid' => $account_id,
':blobdata' => $hol_db_str,
':modify_time' => time()
));
} else {
//insert
$row = $conn->execScript('INSERT INTO holiday(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' => $hol_db_str,
':create_time' => time(),
':modify_time' => time(),
));
}
}
}
?>