query('SELECT * FROM `quests` WHERE `id` = ?i', $pl)->fetch_assoc();
$r = 1;
$qlst = db::c()->query('SELECT `vals` FROM `actions` WHERE `uid` = ?i AND `vars` = "?s"', $uid, 'start_quest'. $pl['id'])->fetch_assoc();
if (db::c()->getAffectedRows() AND !in_array($qlst['vals'],['win','end','vals'])) $r = 2;
unset($qlst, $qlst2);
$d = $this->expl($pl['tr_date']);
if (isset($d['tr_endq'])) {
$i = 0;
$e = explode(',', $d['tr_endq']);
while ($i < count($e)) {
$qlst = mysql_fetch_array(mysql_query('SELECT `id`, `vals` FROM `actions` WHERE `uid` = "' . $uid . '" AND `vars` = "start_quest' . $e[$i] . '" AND `vals` = "win" LIMIT 1'));
if (!isset($qlst['id'])) {
$r = 3;
}
$i++;
}
unset($qn, $qlst, $qlst2);
}
if (isset($d['tr_zdr'])) {
$qlst = mysql_fetch_array(mysql_query('SELECT * FROM `actions` WHERE `uid` = "' . $uid . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" ORDER BY `time` DESC LIMIT 1'));
if ($qlst['time'] + ($d['tr_zdr'] * 60 * 60) - time() > 0) {
$r = 4;
}
unset($qlst);
}
if (isset($d['tr_tm1'])) {
$d['tr_tm1'] = str_replace('d', date('d'), $d['tr_tm1']);
$d['tr_tm1'] = str_replace('m', date('m'), $d['tr_tm1']);
$d['tr_tm1'] = str_replace('y', date('y'), $d['tr_tm1']);
$d['tr_tm2'] = str_replace('d', date('d'), $d['tr_tm2']);
$d['tr_tm2'] = str_replace('m', date('m'), $d['tr_tm2']);
$d['tr_tm2'] = str_replace('y', date('y'), $d['tr_tm2']);
}
if (isset($d['tr_raz'])) {
$qlst = $this->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $uid . '" AND `vars` = "start_quest' . $pl['id'] . '" LIMIT ' . $d['tr_raz'], 2);
if ($d['tr_raz'] > 0 && $d['tr_raz'] - $qlst[0] <= 0) {
$r = 5;
}
unset($qlst);
}
if (isset($d['tr_raz2'])) {
$qlst = $this->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $uid . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" AND `vals` != "win" LIMIT ' . $d['tr_raz2'], 2);
if ($d['tr_raz2'] - $qlst[0] <= 0) {
$r = 6;
}
unset($qlst);
}
return $r;
}
public function __clone()
{
trigger_error('Дублирование не допускается.', E_USER_ERROR);
}
public function startq($id, $uid)
{
$pl = db::c()->query('SELECT `id`,`name`,`time` FROM `quests` WHERE `delete` = 0 AND `id` = ?i', $id)->fetch_assoc();
if (db::c()->getAffectedRows()) {
$tms = (time() + 60 * 60 * $pl['time']);
db::c()->query('INSERT INTO `actions` (`uid`, `time`, `city`, `room`, `vars`, `ip`, `vals`, `val`) VALUES (?i,?i,"?s",?i,"?s","?s","?s","?s")',
$uid, time(), 'capitalcity', 0, 'start_quest'. $id, $_SERVER['HTTP_X_REAL_IP'], 'go', $tms);
return 'Вы успешно получили задание "' . $pl['name'] . '"';
} else {
return 'Не удалось получить данное задание ...';
}
}
public function list_quest($pl, $u)
{
$r = '';
$t = '';
$nagr = '';
$tr = '';
$za = '';
$qlst = db::c()->query('SELECT `vals` FROM `actions` WHERE `uid` = ?i AND `vars` = "?s" ORDER BY `time` DESC', $u, 'start_quest'. $pl['id'])->fetch_assoc();
$ds = $this->expl($pl['win_date']);
if (isset($ds['add_cr'])) $nagr .= "Деньги: {$ds['add_cr']} кр. ";
if (isset($ds['add_point'])) $nagr .= "Репутация: {$ds['add_point']} ед. ";
if (isset($ds['add_exp'])) $nagr .= "Опыт: {$ds['add_exp']} ед. ";
$d = $this->expl($pl['act_date']);
if (isset($d['heal'])) $tr .= "Вылечить {$d['heal']} игроков от травм.
";
if (isset($d['tr_win_haot'])) $tr .= "Выиграть {$d['tr_win_haot']} хаотических поединков.
";
if (isset($d['kill_clone'])) $tr .= "Выиграть {$d['kill_clone']} поединков против своего клона.
";
if(isset($d['tr_win'])) $tr .= "Выйграть {$d['tr_win']} физических поединков против игроков.
";
if (isset($d['kill_bot'])) {
$x = '';
$ex = explode(',', $d['kill_bot']);
$i = 0;
while ($i < count($ex)) {
$ex2 = explode('=', $ex[$i]);
$bot2 = db::c()->query('SELECT `login` FROM `users` WHERE `id` = ?i', $ex2[0])->fetch_assoc();
if (db::c()->getAffectedRows()) $x .= " • {$bot2['login']} {$ex2[1]}
";
$i++;
}
if (!empty($x)) {
$x = trim($x, ', ');
$tr .= "Убить ботов:
{$x}";
}
}
if (!empty($tr)) $ts = 'Требования :
' . $tr;
if ($qlst['time'] + ($pl['heal'] * 60 * 60) - time() > 0) {
$tms = $this->timeOut($qlst['time'] + ($pl['heal'] * 60 * 60) - time());
$za = "Задержка еще: {$tms}
";
}
$d = $this->expl($pl['tr_date']);
$r .= '
';
$r .= '
';
$r .= '
' . $pl['info'] . '
Время на выполнение: ' . $pl['time'] . ' ч.
' . $ts . $za . '
Задание для [' . $pl['min_lvl'] . '-' . $pl['max_lvl'] . '] уровней, с задержкой ' . $pl['heal'] . ' ч.
';
$r .= '
';
return $r;
}
public function info($pl, $uid)
{
$r = '';
$t = '';
$qst = mysql_fetch_array(mysql_query('SELECT * FROM `actions` WHERE `uid` = "' . $uid . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` = "go" LIMIT 1'));
$d = $this->expl($pl['tr_date']);
if (isset($d['tr_endq'])) {
$t .= 'Завершить квесты : ';
$i = 0;
$e = explode(',', $d['tr_endq']);
while ($i <= count($e)) {
if ($e[$i] > 0) {
$qn = mysql_fetch_array(mysql_query('SELECT `name` FROM `quests` WHERE `id` = "' . $e[$i] . '" LIMIT 1'));
if (isset($qn['name'])) {
$t .= '"' . $qn['name'] . '", ';
}
}
$i++;
}
$t = trim($t, ', ');
$t .= '
';
unset($qn);
}
if (isset($d['tr_botitm'])) {
$t .= 'Из ботов выпадают предметы :';
$e = explode('|', $d['tr_botitm']);
$i = 0;
while ($i < count($e)) {
$j = 0;
$e2 = explode('-', $e[$i]);
if ($e2[0] > 0) {
$qn = mysql_fetch_array(mysql_query('SELECT `login` FROM `users` WHERE `id` = "' . $e2[0] . '" LIMIT 1'));
$t .= ' • Из "' . $qn['login'] . '" выпадает: ';
} else {
$t .= ' • Из любых ботов выпадает: ';
}
$j = 0;
$e3 = explode(',', $e2[1]);
while ($j < count($e3)) {
$e4 = explode('=', $e3[$j]);
$qi = mysql_fetch_array(mysql_query('SELECT `id`, `name`, `img` FROM `shop` WHERE `id` = "' . $e4[0] . '" LIMIT 1'));
$t .= ' ' . $qi['name'] . ', ';
$j++;
}
$t = trim($t, ', ');
$i++;
}
$t .= '
';
unset($qn, $qi, $e2, $e3, $e4);
}
if (isset($d['tr_winitm'])) {
$t .= 'После победы выпадают предметы :
';
$e = explode('|', $d['tr_winitm']);
$i = 0;
while ($i < count($e)) {
$j = 0;
$e2 = explode('-', $e[$i]);
$t .= ' • ';
if ($e2[0] > 0) {
$t .= 'Из людей выпадает : ';
} else {
$t .= 'Из ботов выпадает : ';
}
$j = 0;
$e3 = explode(',', $e2[1]);
while ($j < count($e3)) {
$e4 = explode('=', $e3[$j]);
$qi = mysql_fetch_array(mysql_query('SELECT `id`, `name`, `img` FROM `shop` WHERE `id` = "' . $e4[0] . '" LIMIT 1'));
$t .= ' ' . $qi['name'] . ', ';
$j++;
}
$t = trim($t, ', ');
$t .= '
';
$i++;
}
unset($qn, $qi, $e2, $e3, $e4);
}
if (isset($d['tr_zdr'])) {
$qlst = mysql_fetch_array(mysql_query('SELECT * FROM `actions` WHERE `uid` = "' . $uid . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" LIMIT 1'));
$t .= 'Задержка между выполнением задания : ' . $this->timeOut($d['tr_zdr'] * 60 * 60);
if ($qlst['time'] + ($d['tr_zdr'] * 60 * 60) - time() > 0) {
$t .= '(Осталось : ' . $this->timeOut($qlst['time'] + ($d['tr_zdr'] * 60 * 60) - time()) . ' ч.)';
}
$t .= '
';
unset($qlst);
}
if (isset($d['tr_tm1'])) {
$d['tr_tm1'] = str_replace('d', date('d'), $d['tr_tm1']);
$d['tr_tm1'] = str_replace('m', date('m'), $d['tr_tm1']);
$d['tr_tm1'] = str_replace('y', date('y'), $d['tr_tm1']);
$d['tr_tm2'] = str_replace('d', date('d'), $d['tr_tm2']);
$d['tr_tm2'] = str_replace('m', date('m'), $d['tr_tm2']);
$d['tr_tm2'] = str_replace('y', date('y'), $d['tr_tm2']);
$t .= 'Период квеста : ' . $d['tr_tm1'] . ' - ' . $d['tr_tm2'] . '
';
}
if (isset($d['tr_raz'])) {
if ($d['tr_raz'] == -1) {
$t .= 'Сколько еще раз можно выполнить задание: бесконечно
';
} else {
$qlst = $this->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $uid . '" AND `vars` = "start_quest' . $pl['id'] . '" LIMIT ' . $d['tr_raz'], 2);
$t .= 'Сколько раз можно выполнить задание: ' . ($d['tr_raz'] - $qlst[0]) . '
';
}
unset($qlst);
}
if (isset($d['tr_raz2'])) {
$qlst = $this->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $uid . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" AND `vals` != "win" LIMIT ' . $d['tr_raz2'], 2);
$t .= 'Осталось попыток выполнить задание : ' . ($d['tr_raz2'] - $qlst[0]) . '
';
unset($qlst);
}
$d = $this->expl($pl['act_date']);
if (isset($d['kill_bot'])) {
$x = '';
$ex = explode(',', $d['kill_bot']);
$i = 0;
if (isset($d['all_kill']) && $d['all_kill'] > 0) {
while ($i < count($ex)) {
$x2 = 0;
$ex2 = explode('=', $ex[$i]);
if (isset($qst['id'])) {
$x2 = $this->testAction('`uid` = "' . $uid . '" AND `time` > ' . $qst['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $ex2[1], 2);
$x2 = (0 + $x2[0]);
}
$i++;
}
$bot2 = mysql_fetch_array(mysql_query('SELECT * FROM `users` WHERE `id` = "' . $ex2[0] . '" LIMIT 1'));
$bot2['id'] = $bot2['id'];
if (isset($bot2['id'])) {
$x .= ' • ' . $bot2['login'] . ' [' . $x2 . '/' . $d['all_kill'] . ']
';
} else {
$x .= ' • ' . $pl['name'] . ' [' . $x2 . '/' . $d['all_kill'] . ']
';
}
} else {
while ($i < count($ex)) {
$x2 = 0;
$ex2 = explode('=', $ex[$i]);
$bot2 = mysql_fetch_array(mysql_query('SELECT * FROM `users` WHERE `id` = "' . $ex2[0] . '" LIMIT 1'));
if (isset($bot2['id'])) {
if (isset($qst['id'])) {
$x2 = $this->testAction('`uid` = "' . $uid . '" AND `time` > ' . $qst['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $ex2[1], 2);
$x2 = (0 + $x2[0]);
}
$x .= ' • ' . $bot2['login'] . ' [' . $x2 . '/' . $ex2[1] . ']
';
}
$i++;
}
}
if ($x != '') {
$x = trim($x, ', ');
$t .= 'Убить ботов:
' . $x . '';
}
unset($x, $ex, $x2, $bot2, $ex2);
}
if (isset($d['tr_win_haot'])) {
$x = $this->testAction('`uid` = "' . $uid . '" AND `time` > "' . $qst['time'] . '" AND `vars` = "win_haot" LIMIT 1', 2);
$x = (0 + $x[0]);
$t .= 'Победить в хаотических поединках : [' . $x . '/' . $d['tr_win_haot'] . ']
';
unset($x);
}
if (isset($d['kill_clone'])) {
$x = $this->testAction('`uid` = "' . $uid . '" AND `time` > "' . $qst['time'] . '" AND `vars` = "kill_clone" LIMIT 1', 2);
$x = (0 + $x[0]);
$t .= 'Победите в : [' . $x . '/' . $d['kill_clone'] . '] физических боях с клоном.
';
unset($x);
}
if (isset($d['tr_win'])) {
$x = $this->testAction('`uid` = "' . $uid . '" AND `time` > "' . $qst['time'] . '" AND `vars` = "win_fiz" LIMIT 1', 2);
$x = (0 + $x[0]);
$t .= 'Победите в : [' . $x . '/' . $d['tr_win'] . '] физических против игроков.
';
unset($x);
}
if (isset($d['heal'])) {
$x = $this->testAction('`uid` = "' . $uid . '" AND `time` > "' . $qst['time'] . '" AND `vars` LIKE "heal%" AND `vars` != "heal_' . $uid . '" LIMIT 1', 2);
$x = (0 + $x[0]);
$t .= 'Вылечите : [' . $x . '/' . $d['heal'] . '] игроков от травм.
';
unset($x);
}
if (isset($d['tk_itm'])) {
$ex = explode(',', $d['tk_itm']);
$i = 0;
$x = '';
while ($i < count($ex)) {
$ex2 = explode('=', $ex[$i]);
$x2 = mysql_fetch_array(mysql_query('SELECT `koll` FROM `inventory` WHERE `prototype` = "' . mysql_real_escape_string($ex2[0]) . '" AND `owner` = "' . $uid . '" LIMIT 1'));
$bot2 = mysql_fetch_array(mysql_query('SELECT `id`, `name`, `img` FROM `shop` WHERE `id` = "' . mysql_real_escape_string($ex2[0]) . '" LIMIT 1'));
$x .= ' • ' . $bot2['name'] . ' [' . $x2[0] . '/' . $ex2[1] . ']
';
$i++;
}
if ($x != '') {
$x = trim($x, ', ');
$t .= 'Собрать ресурсы :
' . $x . '';
}
}
if ($t != '') {
$r .= 'Условия задания :
' . $t . '
';
$t = '';
}
$ds = $this->expl($pl['win_date']);
if (isset($ds['add_cr'])) {
$t .= 'Деньги : ' . $ds['add_cr'] . ' кр.
';
}
if (isset($ds['add_point'])) {
$t .= 'Репутация : ' . $ds['add_point'] . ' ед.
';
}
if (isset($ds['add_exp'])) {
$t .= 'Опыт : ' . $ds['add_exp'] . ' ед.
';
}
if ($t != '') {
$r = 'Награда:
' . $t . '
' . $r;
$t = '';
}
if ($t != '') {
$r = '
Действия задания :
' . $t . '
' . $r;
$t = '';
}
if ($r == '') {
$r = 'Дополнительная информация по заданию отсутствует';
}
return $r;
}
public function endq($id, $tp, $user)
{
$pl = mysql_fetch_array(mysql_query('SELECT * FROM `quests` WHERE `delete` = "0" AND `min_lvl` <= "' . $user['level'] . '" AND `max_lvl` >= "' . $user['level'] . '" AND `id` = "' . mysql_real_escape_string($id) . '" LIMIT 1'));
$qlst = mysql_fetch_array(mysql_query('SELECT `id` FROM `actions` WHERE `uid` = "' . $user['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` = "go" LIMIT 1'));
if (isset($qlst['id'])) {
if ($tp == 'end') {
mysql_query('UPDATE `actions` SET `vals` = "end" WHERE `id` = "' . $qlst['id'] . '" LIMIT 1');
$this->error = 'Вы успешно отказались от задания "' . $pl['name'] . '"';
} elseif ($tp == 'win') {
mysql_query('UPDATE `actions` SET `vals` = "win" WHERE `id` = "' . $qlst['id'] . '" LIMIT 1');
}
} else {
$this->error = 'Не удалось отказаться от задания ...';
}
}
public function testAction($filter, $tp)
{
if ($tp == 1) {
$ins = mysql_fetch_array(mysql_query('SELECT `id`, `uid`, `time`, `city`, `room`, `vars`, `ip`, `vals`, `val` FROM `actions` WHERE ' . $filter . ''));
} elseif ($tp == 2) {
$ins = mysql_fetch_array(mysql_query('SELECT COUNT(`id`) FROM `actions` WHERE ' . $filter . ''));
}
return $ins;
}
public function timeOut($ttm)
{
$out = '';
$time_still = $ttm;
$tmp = floor($time_still / 2592000);
$id = 0;
if ($tmp > 0) {
$id++;
if ($id < 3) {
$out .= $tmp . " мес. ";
}
$time_still = $time_still - $tmp * 2592000;
}
$tmp = floor($time_still / 86400);
if ($tmp > 0) {
$id++;
if ($id < 3) {
$out .= $tmp . " дн. ";
}
$time_still = $time_still - $tmp * 86400;
}
$tmp = floor($time_still / 3600);
if ($tmp > 0) {
$id++;
if ($id < 3) {
$out .= $tmp . " ч. ";
}
$time_still = $time_still - $tmp * 3600;
}
$tmp = floor($time_still / 60);
if ($tmp > 0) {
$id++;
if ($id < 3) {
$out .= $tmp . " мин. ";
}
}
if ($out == '') {
if ($time_still < 0) {
$time_still = 0;
}
$out = $time_still . ' сек.';
}
return $out;
}
public function expl($d)
{
$i = 0;
$e = explode(':|:', $d);
while ($i < count($e)) {
$t = explode(':=:', $e[$i]);
if (isset($t[0])) {
$dr[$t[0]] = $t[1];
}
$i++;
}
unset($i, $e, $t);
return $dr;
}
public function winqst($id, $user)
{
$bad = 0;
$qlst = mysql_fetch_array(mysql_query('SELECT * FROM `actions` WHERE `uid` = "' . $user['id'] . '" AND `vars` = "start_quest' . $id . '" AND `vals` = "go" LIMIT 1'));
$qu = mysql_fetch_array(mysql_query('SELECT * FROM `quests` WHERE `id` = "' . $id . '" LIMIT 1'));
if (isset($qlst['id'])) {
$d = $this->expl($qu['act_date']);
if (isset($d['heal'])) {
$x = $this->testAction('`uid` = "' . $user['id'] . '" AND `time` > "' . $qlst['time'] . '" AND `vars` LIKE "heal%" AND `vars` != "heal_' . $user['id'] . '" LIMIT 1', 2);
$x = ($x[0] + 0);
if ($x < $d['heal']) {
$bad = 1;
}
unset($x);
}
if (isset($d['tr_win'])) {
$x = $this->testAction('`uid` = "' . $user['id'] . '" AND `time` > "' . $qlst['time'] . '" AND `vars` = "win_fiz" LIMIT 1', 2);
$x = (0 + $x[0]);
if ($x < $d['tr_win']) {
$bad = 1;
}
unset($x);
}
if (isset($d['kill_clone'])) {
$x = $this->testAction('`uid` = "' . $user['id'] . '" AND `time` > "' . $qlst['time'] . '" AND `vars` = "kill_clone" LIMIT 1', 2);
$x = (0 + $x[0]);
if ($x < $d['kill_clone']) {
$bad = 1;
}
unset($x);
}
if (isset($d['tr_win_haot'])) {
$x = $this->testAction('`uid` = "' . $user['id'] . '" AND `time` > "' . $qlst['time'] . '" AND `vars` = "win_haot" LIMIT 1', 2);
$x = (0 + $x[0]);
if ($x < $d['tr_win_haot']) {
$bad = 1;
}
unset($x);
}
if (isset($d['kill_bot'])) {
$ex = explode(',', $d['kill_bot']);
$i = 0;
while ($i < count($ex)) {
$x = 0;
$ex2 = explode('=', $ex[$i]);
$bot2 = mysql_fetch_array(mysql_query('SELECT `id`, `login` FROM `users` WHERE `id` = "' . $ex2[0] . '" LIMIT 1'));
if (isset($bot2['id'])) {
if (isset($qlst['id'])) {
$x = $this->testAction('`uid` = "' . $user['id'] . '" AND `time` > "' . $qlst['time'] . '" AND `vars` = "win_bot_' . $ex2[0] . '"', 2);
$x = ($x[0] + 0);
}
}
$i++;
}
if ($x < $ex2[1]) {
$bad = 1;
}
unset($x);
}
if ($bad == 0) {
$nagr = $this->expl($qu['win_date']);
mysql_query('UPDATE `actions` SET `vals` = "win" WHERE `uid` = "' . $user['id'] . '" AND `vars` = "start_quest' . $id . '" LIMIT 1');
if (isset($nagr['add_cr'])) {
$user['money'] += $nagr['add_cr'];
$c .= $nagr['add_cr'] . ' кр. ';
}
if (isset($nagr['add_point'])) {
$user['doblest'] += $nagr['add_point'];
if (isset($nagr['add_cr'])) {
$c .= 'и ' . $nagr['add_point'] . ' репутации ';
} else {
$c .= $nagr['add_point'] . ' репутации ';
}
}
if (isset($nagr['add_exp'])) {
$user['exp'] += $nagr['add_exp'];
if (isset($nagr['add_cr']) || isset($nagr['add_point'])) {
$c .= 'и ' . $nagr['add_exp'] . ' опыта';
} else {
$c .= $nagr['add_exp'] . ' опыта';
}
}
mysql_query('UPDATE `users` SET `money` = "' . $user['money'] . '", `exp` = "' . $user['exp'] . '", `doblest` = "' . $user['doblest'] . '" WHERE `id` = "' . $user['id'] . '" LIMIT 1');
$this->error = 'Вы успешно сдали задание!';
$text = 'Внимание! За успешно выполненное задание Вы получили : ' . $c;
$this->msg($text, '{[]}' . $user['login'] . '{[]}', $user['room']);
} else {
$this->error = 'Не все условия задания были выполнены ...';
}
} else {
$this->error = 'Квест не найден ...';
}
}
public function msg($text, $who, $room)
{
$fp = fopen("/tmp/chat.txt", "a");
flock($fp, LOCK_EX);
fputs($fp, ":[" . time() . "]:[{$who}]:[" . ($text) . "]:[" . $room . "]\r\n");
fflush($fp);
flock($fp, LOCK_UN);
fclose($fp);
}
}
$q = new Quests;