class Quests {
public $free_x = 28, $data = array(), $error = '';
public function testGood($pl, $uid) {
if(!is_array($pl)) {
$pl = mysql_fetch_array(mysql_query('SELECT * FROM `quests` WHERE `id` = "'.$pl.'" LIMIT 1'));
}
$r = 1;
$qlst = mysql_fetch_array(mysql_query('SELECT `id`, `vals` FROM `actions` WHERE `uid` = "'.$uid.'" AND `vars` = "start_quest'.$pl['id'].'" LIMIT 1'));
if(isset($qlst['id']) && $qlst['vals'] != 'win' && $qlst['vals'] != 'end' && $qlst['vals'] != 'bad') {
$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, $val = NULL, $uid) {
$pl = mysql_fetch_array(mysql_query('SELECT * FROM `quests` WHERE `delete` = "0" AND `id` = "'.mysql_real_escape_string($id).'" LIMIT 1'));
if(isset($pl['id'])) {
$tms = (time()+60*60*$pl['time']);
$this->addAction(time(), 'start_quest'.$pl['id'], 'go', $uid, $tms);
$this->error = 'Вы успешно получили задание "'.$pl['name'].'"';
} else {
$this->error = 'Не удалось получить данное задание ...';
}
}
public function list_quest($pl, $u) {
$r = ''; $t = ''; $nagr = ''; $tr = '';
$qlst = mysql_fetch_array(mysql_query('SELECT * FROM `actions` WHERE `uid` = "'.$u.'" AND `vars` = "start_quest'.$pl['id'].'" ORDER BY `time` DESC LIMIT 1'));
$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 = mysql_fetch_array(mysql_query('SELECT `id`, `login` FROM `users` WHERE `id` = "'.$ex2[0].'" LIMIT 1'));
if(isset($bot2['id'])) {
$x .= ' • '.$bot2['login'].' '.$ex2[1].'
';
}
$i++;
}
if($x != '') {
$x = trim($x, ', ');
$tr .= 'Убить ботов:
'.$x.'';
}
}
if($tr != '') {
$ts = 'Требования :
'.$tr;
}
$za = '';
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 addAction($time, $vars, $vls, $uid, $val) {
$ins = mysql_query('INSERT INTO `actions` (`uid`, `time`, `city`, `room`, `vars`, `ip`, `vals`, `val`) VALUES ("'.$uid.'", "'.$time.'", "capitalcity", "0", "'.mysql_real_escape_string($vars).'", "'.mysql_real_escape_string($_SERVER['HTTP_X_REAL_IP']).'", "'.mysql_real_escape_string($vls).'", "'.$val.'")');
if($ins) {
return true;
} else {
return false;
}
}
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;