u = User::start(); unset($_POST['kingfight'], $_POST['nobot'], $_POST['mut_clever']); $this->u->info['no_zv_key'] = true; if (!empty($_GET['del_z_time'])) { $zay = Db::getValue( 'select count(*) from zayvki where id = ? and creator = ? and start = 0 and cancel = 0 and btl_id = 0 and priz = 0', [$this->u->info['zv'], $this->u->info['id']] ); if ($zay) { $cols = $this->countUsersAll($this->u->info['zv']); if ($cols === 1) { Db::sql('update stats set zv = 0 where id = ?', [$this->u->info['id']]); Db::sql('delete from zayvki where id = ?', [$this->u->info['zv']]); } } } $this->test(); //проверяем заявки } /** Считаем количество людей в конкретной заявке. * @param int $frId id заявки * @return int */ private function countUsersAll(int $frId): int { return Db::getValue('select count(*) from stats where zv = ?', [$frId]); } /** Проверяем заявки * @return void */ private function test() { if ($this->u->info['zv'] > 0) { $z = Db::getValue( 'select count(*) from zayvki where id = ? and (cancel > 0 or btl_id >0 or time < unix_timestamp() - 3600)', [$this->u->info['zv']] ); if ($z > 0) { $this->u->info['zv'] = 0; Db::sql('update stats set zv = 0 where id = ?', [$this->u->info['id']]); } } $this->testGroupAndChaotic(); } private function testGroupAndChaotic() { //Проверяем хаотичные и групповые бои [в этом городе ?] $sp = Db::getRows( 'select * from zayvki where btl_id = 0 and cancel = 0 and start = 0 and razdel in (4,5) order by id desc limit 22' ); foreach ($sp as $pl) { $uz = Db::getRow( 'select * from users left join stats on users.id = stats.id where zv = ?', [$pl['id']] ); $i = []; $toChat = ''; $toWhere = ''; if (is_iterable($uz)) { foreach ($uz as $t) { ${'tm' . $t['team']} ??= []; $i[$t['team']] ??= 0; ${'tm' . $t['team']}[$i[$t['team']]] = $t; $toChat .= '' . $t['login'] . ','; $toWhere .= 'OR `id` = "' . $t['id'] . '" '; $i[$t['team']]++; } } if ($pl['razdel'] == self::BATTLE_RAZDEL_CHAOTIC) { $cols = $this->countUsersAll($pl['id']); if ($cols >= $pl['maxplayers']) { $pl['time_start'] = time() - $pl['time'] - 1; } } if ( $pl['time_start'] >= time() - $pl['time'] && ($pl['razdel'] != self::BATTLE_RAZDEL_GROUP || $i[1] < $pl['tm1max'] || $i[2] < $pl['tm2max']) ) { continue; } $toChat = rtrim($toChat, ','); $toWhere = ltrim($toWhere, 'OR '); if ($pl['razdel'] == self::BATTLE_RAZDEL_GROUP) { $this->testGroup($i, $pl, $toChat, $toWhere); } else { $this->testCronChaotic($pl, $toChat, $toWhere); } } } private function testGroup($groups, $zayavka, $toChat, $toWhere) { if ($zayavka['razdel'] != 4) { return; } if ( empty($groups[1]) || empty($groups[2]) || ( empty($groups[3]) && $zayavka['teams'] == 3 ) ) { //группа не набрана $this->cancelGroup($zayavka, $toChat); } else { //Начинаем поединок $this->startBattle($zayavka['id'], $toChat . '|-|' . $toWhere); } } private function cancelGroup($zv, $uids, $debug = null) { Db::sql('update stats set zv = default where zv = ?', [$zv['id']]); Db::sql('update zayvki set cancel = unix_timestamp() where id = ?', [$zv['id']]); if (empty($uids)) { return; } $text = ' Не удалось начать поединок по причине: Группа не набрана!'; if ($zv['priz'] > 0) { $pg = $this->cancelPrizedChaotic($zv); if (!empty($pg[0])) { $uids = $pg[0]; } $text .= $pg[1]; } $chat = new Chat(); $chat->sendsys($text . $debug, $uids); } private function cancelPrizedChaotic(array $zv): array { $stmt = Db::getRows('select id from stats where zv = ?', [$zv['id']]); foreach ($stmt as $user) { if ($zv['type'] === self::CHAOTIC_TYPE_PRIZED) { $stmt2 = Db::getValue('select id from users where inUser = ?', [$user['id']]); if (!empty($stmt2)) { Db::sql('update users set inUser = 0 where id = ?', [$stmt2]); Db::sql('delete from users where id = ?', [$user['id']]); Db::sql('delete from stats where id = ?', [$user['id']]); Db::sql('delete from items_users where uid = ?', [$user['id']]); Db::sql('delete from eff_users where uid = ?', [$user['id']]); // \Core\ConversionHelper::dataStringToArray(4754, $user['id']); } } else { // \Core\ConversionHelper::dataStringToArray(4754, $user['id']); реликвии ангела } } return [ $stmt2 ?? 0, ' Вы получаете Призовой Жетон (х1)', ]; } public function startBattle($id, $vars = null) { // что это? $z = Db::getRow( 'select * from zayvki where id = ? and start = 0 and cancel = 0 and (time > unix_timestamp() - 60*60*2 or razdel > 3)', [$id] ); if (!isset($z['id'])) { return; } $vars = explode('|-|', $vars); if ($z['razdel'] == self::BATTLE_RAZDEL_GROUP || $z['razdel'] == self::BATTLE_RAZDEL_CHAOTIC) { if ($z['razdel'] == self::BATTLE_RAZDEL_CHAOTIC) { $sp = Db::getRows( 'select id, team, upLevel, btl_cof, exp from stats where zv = ? order by btl_cof desc', [$z['id']] ); // Разбивка на команды раньше зависела от равной суммы btl_cof в командах, но как это должно было // работать никто не знал. Теперь просто пул игроков мешается и бьётся пополам. Ins. $pld2 = []; $team1IdsArr = []; $team2IdsArr = []; foreach ($sp as $pl) { $pld2[] = $pl; } shuffle($pld2); $pieces = array_chunk($pld2, ceil(count($pld2) / 2)); foreach ($pieces[0] as $team1) { $team1IdsArr[] = $team1['id']; } foreach ($pieces[1] as $team2) { $team2IdsArr[] = $team2['id']; } $team1Ids = implode($team1IdsArr); $team2Ids = implode($team2IdsArr); Db::sql('update stats set team = 1 where id in (?)', [$team1Ids]); Db::sql('update stats set team = 2 where id in (?)', [$team2Ids]); } $args = [ $z['otmorozok'], $z['priz'], $z['smert'], $z['noart'], $z['noeff'], $z['noatack'], $z['arand'], $z['kingfight'], $z['nobot'], $z['fastfight'], $z['razdel'], $z['city'], $z['timeout'], $z['type'], $z['invise'], $z['travmChance'], $z['exp'], ]; $q = 'insert into battle ( otmorozok, priz, smert, noart, noeff, noatack, arand, kingfight, nobot, fastfight, razdel, city, time_start, timeout, type, invis, travmChance, addExp ) values (?,?,?,?,?,?,?,?,?,?,?,?,unix_timestamp(),?,?,?,?,?)'; //ТУТ старт боя Db::sql($q, $args); unset($q, $args); $btl_id = Db::lastInsertId(); if ($btl_id) { if ($z['type'] == self::BATTLE_TYPE_MELEE) { Db::sql( 'update items_users set inOdet = 0 where uid in (select id from stats where zv = ?)', [$z['id']] ); } elseif ($z['type'] == self::BATTLE_TYPE_NO_EKR_ITEMS) { Db::sql( 'update items_users set inOdet = 0 where uid in (select id from stats where zv = ?) and 2price > 0', [$z['id']] ); } //обновляем данные о поединке Db::sql('update stats set zv = 0 where zv = ?', [$z['id']]); $q = 'update users set battle = ' . $btl_id . ' where ' . $vars[1]; Db::sql($q); unset($q); //обновляем заявку, что бой начался Db::sql('update zayvki set start = unix_timestamp(), btl_id = ? where id = ?', [$btl_id, $z['id']]); $this->u->info['battle'] = $btl_id; //Отправляем сообщение в чат всем бойцам $this->sendSysChatSound($vars[0], -1); } } elseif ($z['razdel'] >= 1 && $z['razdel'] <= 3) { //начало PvP if ($this->u->info['team'] != 1 || $this->u->info['zv'] != $z['id']) { $this->error = 'Вы не можете начать поединок.'; } else { $enemyId = Db::getValue('select id from stats where zv = ? and team = 2 limit 1', [$z['id']]); if (!$enemyId) { $this->error = 'Вы не можете начать поединок, вашу заявку никто не принял.'; } else { $enemy = Db::getRow('select login, money from users where id = ?', [$enemyId]); //создаем поединок if ( $enemy['money'] < $z['money'] || $this->u->info['money'] < $z['money'] ) { $z['money'] = 0.00; } $args = [ $z['otmorozok'], $z['smert'], $z['noart'], $z['noeff'], $z['noatack'], $z['arand'], $z['kingfight'], $z['nobot'], $z['fastfight'], $this->u->info['city'], $z['timeout'], $z['type'], $z['travmChance'], $z['money'], ]; $q = 'insert into battle ( otmorozok, smert, noart, noeff, noatack, arand, kingfight, nobot, fastfight, city, time_start, timeout, type, travmChance, money ) values (?,?,?,?,?,?,?,?,?,?,unix_timestamp(),?,?,?,?)'; Db::sql($q, $args); $btl_id = Db::lastInsertId(); unset($q, $args); if (!$btl_id) { $this->error = 'Ошибка создания битвы.'; } else { //обновляем данные о поединке Db::sql('update stats set zv = 0 where zv = ?', [$z['id']]); Db::sql( 'update users set battle = ? where id = ? or id = ?', [$btl_id, $this->u->info['id'], $enemyId] ); //Если бой кулачный, то снимаем вещи if ($z['type'] == self::BATTLE_TYPE_MELEE) { Db::sql( 'update items_users set inOdet = 0 where uid in (?,?) ', [$this->u->info['id'], $enemyId] ); } //обновляем заявку, что бой начался Db::sql( 'update zayvki set start = unix_timestamp(), btl_id = ? where id = ?', [$btl_id, $z['id']] ); $this->u->info['battle'] = $btl_id; //Отправляем сообщение в чат всем бойцам $this->sendSysChatSound($enemy['login']); die(''); } } } } } /** * Звуковой пинг в чат? * @return void * @todo убрать колхоз с условиями когда станет ясно как оно работает. */ private function sendSysChatSound(string $to = '', int $room = 0) { $cmsg = new ChatMessage(); if (empty($to)) { $cmsg->setTo($this->u->info['login']); } else { $cmsg->setTo($to); } if (empty($room)) { $cmsg->setRoom($this->u->info['room']); } else { $cmsg->setRoom($room); } $cmsg->setCity($this->u->info['city']); $cmsg->setType(11); $cmsg->setSound(117); (new Chat())->sendMsg($cmsg); } private function testCronChaotic($zayavka, $toChat, $toWhere) { $chat = new Chat(); $levelToExp = [ 0 => 0, 1 => 110, 2 => 420, 3 => 1300, 4 => 2500, 5 => 5000, 6 => 12500, 7 => 30000, 8 => 300000, 9 => 3000000, 10 => 10000000, 11 => 52000000, 12 => 63000000, 13 => 182000000, 14 => 212000000, 15 => 352000000, 16 => 504000000, 17 => 1187000000, 18 => 2455000000, 19 => 4387000000, 20 => 6355000000, 21 => 15500000000, 22 => 755500000000, ]; $botUsers = []; define('FAST_FIGHT_REQUIRED_FIGHTERS_COUNT', 2); define('FIGHT_REQUIRED_FIGHTERS_COUNT', 6); $requiredFightersToStartBattle = FIGHT_REQUIRED_FIGHTERS_COUNT; if ($zayavka['fastfight'] > 0) { $requiredFightersToStartBattle = FAST_FIGHT_REQUIRED_FIGHTERS_COUNT; } $pendingFightersCount = $this->countUsersAll($zayavka['id']); if ($pendingFightersCount < $requiredFightersToStartBattle) { //группа не набрана //Добавляем недостающих игроков if (!$zayavka['nobot']) { // Если нет запрета на ботов. //$getRealPlayersQuery = 'select * from stats left join users on stats.id = users.id where exp >= ? and exp < ? and bot = 0 order by btl_cof desc limit 50'; $getBotsQuery = 'select * from stats left join users on stats.id = users.id where bot = 2 and exp >= ? and exp < ?'; $botUsers = Db::getRows( $getBotsQuery, [$levelToExp[$zayavka['min_lvl_1']], $levelToExp[$zayavka['max_lvl_1'] + 1]] ); } if (empty($botUsers)) { $text = ' Не удалось начать поединок по причине: Группа не набрана. (' . $zayavka['id'] . ': 0 ' . $levelToExp[$zayavka['min_lvl_1']] . '-' . $levelToExp[$zayavka['max_lvl_1'] + 1] . ')'; $chat->sendsys($text, 'Merlin'); $this->cancelGroup($zayavka, $toChat, ' Боты проспали.'); } else { $pendingBotsCount = 0; for ($i = 0; $i < $requiredFightersToStartBattle - $pendingFightersCount; $i++) { shuffle($botUsers); $botInfo = array_shift($botUsers); $botData = [ 'id' => $botInfo['id'], 'login' => $botInfo['login'], 'level' => $botInfo['level'], 'city' => $botInfo['city'], 'cityreg' => $botInfo['city'], 'name' => $botInfo['login'], 'sex' => $botInfo['sex'], 'hobby' => '', 'time_reg' => time(), 'obraz' => $botInfo['obraz'], 'stats' => $botInfo['stats'], 'upLevel' => $botInfo['upLevel'], 'priems' => $botInfo['priems'], 'loclon' => true, ]; $bot = $this->u->addNewbot(1, null, $botData, null, true); if (!$bot) { continue; } Db::sql( 'update stats set btl_cof = ?, zv = ?, hpNow = 1000000, mpNow = 1000000 where id = ?', [$botInfo['btl_cof'], $zayavka['id'], $bot] ); Db::sql('update users set room = 303, battle = 0 where id = ?', [$bot]); $pendingBotsCount++; } unset($botUsers, $botInfo, $botData, $bot); if ($pendingBotsCount + $pendingFightersCount >= $requiredFightersToStartBattle) { $this->backTest = true; self::$bcktst = true; } } } else { //Начинаем поединок $this->startBattle($zayavka['id'], $toChat . '|-|' . $toWhere); } } public function testCronZv() { $this->testCronGroupAndChaotic(); if ($this->backTest || self::$bcktst) { self::$bcktst = false; $this->testCronZv(); } } /** Проверяем хаотичные и групповые бои [в этом городе ?] */ private function testCronGroupAndChaotic(): void { $zv1k = Db::getRows( 'select * from zayvki where btl_id = 0 and cancel = 0 and start = 0 and razdel in (4, 5) order by id desc' ); foreach ($zv1k as $zv) { $i = []; $toChat = $toWhere = ''; $users = Db::getRows( 'select * from stats left join users on stats.id = users.id where zv = ?', [$zv['id']] ); foreach ($users as $user) { ${'tm' . $user['team']} ??= []; $i[$user['team']] ??= 0; ${'tm' . $user['team']}[$i[$user['team']]] = $user; $toChat .= $user['login'] . ','; $toWhere .= 'OR id = ' . $user['id'] . ' '; $i[$user['team']]++; } if ( $zv['time_start'] > time() - $zv['time'] && ($zv['razdel'] != self::BATTLE_RAZDEL_GROUP || $i[1] < $zv['tm1max'] || $i[2] < $zv['tm2max']) ) { continue; } $toChat = rtrim($toChat, ','); $toWhere = ltrim($toWhere, 'OR '); if ($zv['razdel'] == self::BATTLE_RAZDEL_GROUP) { $this->testGroup($i, $zv, $toChat, $toWhere); } else { $this->testCronChaotic($zv, $toChat, $toWhere); } } } public function addGroupOrChaoticRequest(int $r) { if (!in_array($r, [self::BATTLE_RAZDEL_GROUP, self::BATTLE_RAZDEL_CHAOTIC])) { return; } $k = (int)$_POST['k']; $az = 1; if ($this->testTravm() == 1 && $k !== 1) { $this->error = 'Вы травмированы. С такими увечьями доступны кулачные бои.'; $az = 0; } elseif ($this->testTravm() == 2) { $this->error = 'Вы травмированы. С такими увечьями невозможно сражаться.'; $az = 0; } elseif ($this->u->isWeakened()) { $this->error = 'Вы еще слишком ослаблены чтобы начать новый бой'; $az = 0; } if ($this->u->info['zv'] > 0) { $this->error = 'Вы уже находитесь в заявке.'; $az = 0; } if ($az === 0) { return; } $timeout = (int)$_POST['timeout']; $nz = []; $nz['travmaChance'] = 0; $nz['time_start'] = 0; $nz['tm1max'] = 0; $nz['tm2max'] = 0; $nz['invise'] = 0; $nz['tm1'] = 0; $nz['tm2'] = 0; $nz['otmorozok'] = 0; $nz['fastfight'] = 0; $nz['noinc'] = 0; $nz['type'] = 0; if ($k === 1) { $nz['type'] = 1; } if ($k === 2) { $nz['type'] = 6; $nz['travmaChance'] = 100; } if (!in_array($timeout, [1, 2, 3, 4, 5])) { $timeout = 3; } $nz['timeout'] = $timeout * 60; $nz['razdel'] = $r; $nz['comment'] = substr($_POST['cmt'], 0, 40); $nz['comment'] = str_replace('"', '"', $nz['comment']); $gad = 1; if ($r == self::BATTLE_RAZDEL_CHAOTIC) { //хаотичный бой if ($_POST['startime2']) { $nz['time_start'] = (int)$_POST['startime2']; if (!in_array($nz['time_start'], [60, 180, 300])) { $nz['time_start'] = 600; } if (isset($_POST['mut_hidden'])) { $nz['invise'] = 1; } if (isset($_POST['noinc'])) { $nz['noinc'] = 1; } if (isset($_POST['fastfight'])) { $nz['fastfight'] = 1; } if (isset($_POST['otmorozok'])) { $nz['otmorozok'] = 1; } if (isset($_POST['nobot'])) { $nz['nobot'] = 1; } if (isset($_POST['kingfight'])) { $nz['kingfight'] = 1; } if (isset($_POST['arand'])) { $nz['arand'] = 1; } if (isset($_POST['travma'])) { $nz['travmaChance'] = 100; } if (isset($_POST['noatack'])) { $nz['noatack'] = 1; } if (isset($_POST['noeff'])) { $nz['noeff'] = 1; } if (isset($_POST['smert'])) { $nz['smert'] = 1; } if (isset($_POST['noart'])) { $nz['noart'] = 1; } if ($nz['kingfight'] == 1 && $nz['fastfight'] == 1) { $nz['kingfight'] = 0; } //Генерируем уровни $levels = FRHelper::getChaoticTeammatesLevel($_POST['levellogin1'], $this->u->info['level']); $nz['min_lvl_1'] = $levels->min; $nz['max_lvl_1'] = $levels->max; $nz['min_lvl_2'] = $levels->min; $nz['max_lvl_2'] = $levels->max; $nz['tm1'] = $this->u->stats['reting']; if ( !$this->u->info['no_zv_key'] && ( $_POST['code21'] == 0 || $_POST['code21'] != $_SESSION['code2'] || $_SESSION['code2'] == 0 || !isset($_SESSION['code2']) ) ) { $this->error = 'Неправильный код подтверждения'; $gad = 0; } } else { $gad = 0; $this->error = 'Что-то не так...
'; } } elseif ($r == self::BATTLE_RAZDEL_GROUP) { //групповой бой //здесь заносим и проверяем данные на гурпповой бой if ($_POST['startime']) { $nz['time_start'] = (int)$_POST['startime']; if (!in_array($nz['time_start'], [300, 600, 900, 1200, 1800])) { $nz['time_start'] = 600; } $nz['tm1max'] = Comparsion::minimax((int)$_POST['nlogin1'], 1, 99); $nz['tm2max'] = Comparsion::minimax((int)$_POST['nlogin2'], 1, 99); //Генерируем уровни союзника $levels = FRHelper::getTeammatesLevel($_POST['levellogin1'], $this->u->info['level']); $nz['min_lvl_1'] = $levels->min; $nz['max_lvl_1'] = $levels->max; //Генерируем уровни противника $levels = FRHelper::getTeammatesLevel($_POST['levellogin2'], $this->u->info['level']); $nz['min_lvl_2'] = $levels->min; $nz['max_lvl_2'] = $levels->max; } else { $gad = 0; $this->error = 'Что-то не так...
'; } } $bt2 = (int)$_POST['bots2']; if ($bt2 != 0 && $r == self::BATTLE_RAZDEL_GROUP) { $bt2 = 1; $nz['min_lvl_2'] = $this->u->info['level']; $nz['max_lvl_2'] = $this->u->info['level']; $nz['min_lvl_1'] = $this->u->info['level']; $nz['max_lvl_1'] = $this->u->info['level']; } else { $bt2 = 0; } if ($gad == 1) { if ($nz['razdel'] == self::BATTLE_RAZDEL_CHAOTIC) { $nz['maxplayers'] = (int)$_POST['players']; } $dbvalues = [ $nz['maxplayers'], $nz['otmorozok'], $nz['smert'], $nz['noart'], $nz['noeff'], $nz['noatack'], $nz['arand'], $nz['kingfight'], $nz['nobot'], $nz['fastfight'], $nz['noinc'], $bt2, strtotime(date('d.m.Y H:i:00')), $this->u->info['city'], $this->u->info['id'], $nz['type'], $nz['time_start'], $nz['timeout'], $nz['min_lvl_1'], $nz['min_lvl_2'], $nz['max_lvl_1'], $nz['max_lvl_2'], $nz['tm1max'], $nz['tm2max'], $nz['travmaChance'], $nz['invise'], $nz['razdel'], $nz['comment'], $nz['tm1'], $nz['tm2'], ]; $dbquery = 'insert into zayvki (`maxplayers`,`otmorozok`,`smert`,`noart`,`noeff`,`noatack`,`arand`,`kingfight`,`nobot`,`fastfight`,`noinc`,`bot2`,`time`,`city`,`creator`,`type`,`time_start`,`timeout`,`min_lvl_1`,`min_lvl_2`,`max_lvl_1`,`max_lvl_2`,`tm1max`,`tm2max`,`travmaChance`,`invise`,`razdel`,`comment`,`tm1`,`tm2`) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'; Db::run($dbquery, $dbvalues); $zid = Db::lastInsertId(); if ($zid) { Db::sql('update stats set zv = ?, team = 1 where id = ?', [$zid, $this->u->info['id']]); $this->u->info['zv'] = $zid; $this->error = 'Заявка на бой подана'; } else { $this->error = 'Ошибка: Заявка не подана!'; } } } private function testTravm() { $tr = Db::getValue( 'select v1 from eff_users where id_eff = 4 and `delete` = 0 and uid = ? order by v1 desc limit 1', [$this->u->info['id']] ); return $tr ? $tr - 1 : 0; } public function getCurrentStatus(array $zi, int $r) { // нахуй статус // если у меня нет заявки // если я в бою // если я не в тех категориях if ( !$this->u->info['zv'] || $this->u->info['battle'] > 0 || !in_array($r, [self::BATTLE_RAZDEL_GROUP, self::BATTLE_RAZDEL_CHAOTIC, self::BATTLE_RAZDEL_TOURNAMENTS]) ) { return; } $battleType = [ self::BATTLE_RAZDEL_GROUP => 'группового', self::BATTLE_RAZDEL_CHAOTIC => 'хаотичного', ]; $tm_start = floor(($zi['time'] + $zi['time_start'] - time()) / 6) / 10; $tm_start = $this->rzv($tm_start); echo 'Ожидаем начала ' . $battleType[$zi['razdel']] . ' боя'; echo '
Ваш бой начнется через ' . $tm_start . ' мин.'; } /** Дописывает значение после точки, если такового нет. 1 -> 1.0, 1.1 -> 1.1 * @param string $str * @return string */ public function rzv(string $str): string { $symbols = explode('.', $str); return isset($symbols[1]) ? $symbols[0] . '.' . $symbols[1] : $symbols[0] . '.0'; } public function getEndedBattlesList(string $slogin, int $dt) { $code = PassGen::intCode(); $btl = ''; $see = ''; $usr = Db::getRow('select id, login, level, city from users where login = ? limit 1', [$slogin]); if (isset($usr['id'])) { $tms = $dt; $tmf = $dt + 86400; $sp = Db::getRows( 'select * from battle_last where time >= ? and time < ? and uid = ? order by id desc ', [$tms, $tmf, $usr['id']] ); $jk = 0; $btl_lst = []; foreach ($sp as $pl) { $b = Db::getRow('select * from battle_end where battle_id = ? limit 1', [$pl['battle_id']]); $tm = ''; if (isset($b['id'])) { $tms = []; $ts = []; $spi = Db::getRows('select * from battle_last where battle_id = ?', [$pl['battle_id']]); foreach ($spi as $pli) { if (!isset($tms[$pli['team']])) { $ts[] = $pli['team']; } $tms[$pli['team']][count($tms[$pli['team']])] = $pli; } $k = 0; while ($k < count($ts)) { $g = $ts[$k]; $h = 0; $tm2 = ''; while ($h < count($tms[$g])) { if ($tms[$g][$h]['uid'] > 0) { if ($tms[$g][$h]['align'] > 0) { $tm2 .= ''; } $tm2 .= '' . $tms[$g][$h]['login'] . ' [' . $tms[$g][$h]['lvl'] . '] , '; } $h++; } $tm2 = rtrim($tm2, ', '); $btlg = Db::getValue('select id, team_win from battle where id = ?', [$pl['battle_id']]); if (isset($btlg['id']) && $g == $btlg['team_win']) { $tm2 .= ' '; } $tm .= $tm2; if ($k + 1 < count($ts) && $tm2 != '' && $ts[$k + 1] > 0) { $tm .= ' против '; } $k++; } } if (!isset($btl_lst[$b['id']])) { $btl_lst[$b['id']] = true; if ($tm == '') { $tm = 'Данные поединка потеряны'; } $jk++; $btl .= $jk . '. ' . date( 'd.m.y H:i', $pl['time'] ) . ' ' . $tm . ' »»
'; } } } $see .= empty($btl) ? '
В этот день не было боев, или же, летописец опять потерял свитки...


' : $btl; echo $see; } public function getCurrentBattlesList(): void { $code = PassGen::intCode(); $query = 'select login, users.id, team, battle, time_start, typeBattle from users left join stats on users.id = stats.id left join battle on users.battle = battle.id where battle in (select id from battle where type != 329 and team_win = -1 and time_over = 0 and start1 > 0 order by time_start) order by battle desc'; $currentBattles = Db::getRows($query); if (empty($currentBattles)) { echo '
К сожалению сейчас боев нет...
'; } else { // Надеялся на вывод вида: // [battle -> [team -> [uid, uid, uid], team -> [uid, uid, uid],]], // [battle -> [team -> [uid, uid, uid], team -> [uid, uid, uid],]], // но глубоко наломался, где-то перемудрил с ArraySorter::groupBy() // и на выходе там сортировка, но с сохранением всех вложенностей, // что усложнило последющий вывод. Но вышло как вышло. Ins. $currentBattlesArray = ArraySorter::groupBy($currentBattles, 'battle'); echo '
    '; foreach ($currentBattlesArray as $battleId => $cb) { $players = ''; $typeBattle = 0; $timeStart = 0; $teams = ArraySorter::groupBy($cb, 'team'); foreach ($teams as $teamId => $team) { foreach ($team as $key => $player) { $players .= $this->u->microLogin($player['id']); if ($key !== array_key_last($team)) { $players .= ', '; } else { $typeBattle = $player['typeBattle']; $timeStart = $player['time_start']; } } if ($teamId !== array_key_first($teams)) { continue; } $players .= ' против '; } echo '
  1. ' . date('d.m.y H:i', $timeStart) . ''; echo " $players "; echo ''; echo '▶▶'; } echo '
'; } } public function getTournaments(): object { /** Турниры by Insallah*/ # Защита от F5 if (!isset($_SESSION['bypass'])) { $_SESSION['bypass'] = mt_rand(); } if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['key'] == $_SESSION['bypass']) { unset($_SESSION['bypass']); if (array_key_exists('tournament_start', $_POST)) { (new Tournament())->join($this->u->info['id']); } } # Формируем список идущих турниров. $tournamentsList = Db::getRows('select * from tournaments'); $tournaments = ''; return (object)[ 'hasTournaments' => !empty($tournamentsList), 'listTournaments' => $tournaments, ]; /** Конец турниров от Insallah. */ } public function seeZv(array $zi, int $r) { $code = PassGen::intCode(); if (!$r) { return; } if (!in_array($r, [self::BATTLE_RAZDEL_GROUP, self::BATTLE_RAZDEL_CHAOTIC])) { return; }//Список заявок $i = 0; $fightrequests = Db::getRows( 'select * from zayvki where razdel = ? and start = 0 and cancel = 0 and time > unix_timestamp() - ? order by id desc', [$r, 2 * 60 * 60] ); $zvb = ''; foreach ($fightrequests as $pl) { $tmStart = floor(($pl['time'] + $pl['time_start'] - time()) / 6) / 10; $tmStart = $this->rzv($tmStart); if (!empty($pl['comment'])) { $dl = ''; if ($this->u->isModerator() && $pl['dcom'] == 0) { $dl .= ' (удалить комментарий)'; $pl['dcom'] = $this->deleteComment($pl['id']); } if ($pl['dcom'] > 0) { $dl = ' Комментарий удален модератором'; if (!$this->u->isModerator()) { $pl['comment'] = ''; } } $zv_comm = ' ' . $pl['comment'] . $dl . ' '; } else { $zv_comm = ''; } $rad = ''; if ($pl['razdel'] == self::BATTLE_RAZDEL_CHAOTIC) { $tm = ''; $uids = Db::getColumn('select id from stats where zv = ?', [$pl['id']]); $cols = count($uids); foreach ($uids as $uid) { $tm .= $this->u->microLogin($uid) . ', '; } $tm = rtrim($tm, ', '); if (!isset($zi['id']) && $this->u->room['zvsee'] == 0) { $rad = ' '; } $n1tv = ''; $unvs = ''; if ($pl['invise'] == 1) { $userslist = $this->u->isModerator() ? $tm : ''; $tm = '' . $this->u->microLogin($pl['creator']) . '' . $userslist . ' - невидимый'; $unvs = ' Участников: ' . $cols . ' чел. '; $n1tv .= ' '; } if ($pl['kingfight'] == 1) { $n1tv .= ' '; } if ($pl['travmaChance'] == 100) { $n1tv .= ''; } if ($pl['noatack'] == 1) { $n1tv .= ' '; } if ($pl['nobot'] == 1) { $n1tv .= ' '; } if ($pl['fastfight'] == 1) { $n1tv .= ' '; } if ($pl['noeff'] == 1) { $n1tv .= ' '; } if ($pl['arand'] == 1) { $n1tv .= ' '; } if ($pl['noart'] == 1) { $n1tv .= ' '; } if ($pl['otmorozok'] == 1) { $n1tv .= ' '; } if ($pl['priz'] == 1) { $zv_comm = ' (Героическое Сражение)'; } if ($r == 5 && ($pl['creator'] == $this->u->info['id']) && $cols < 2 && $pl['priz'] == 0) { $del_q = '   '; } else { $del_q = ''; } $lvldt = ''; if ($pl['min_lvl_1'] != $pl['max_lvl_2']) { $lvldt .= '' . $pl['min_lvl_1'] . '-' . $pl['max_lvl_2'] . ' ур. '; } else { $lvldt .= '' . $pl['min_lvl_1'] . ' ур. '; } $lvldt .= $cols . '/' . $pl['maxplayers']; $zvb .= $rad . '' . date('H:i', $pl['time']) . ' (' . $lvldt . ') тип боя: ' . $n1tv . ' (таймаут ' . ($pl['timeout'] / 60) . ' мин.) ' . $zv_comm . ' (' . $unvs . 'Бой начнется через ' . $tmStart . ' мин.) Участники: ' . $tm . ' ' . $del_q . '
'; } elseif ($pl['razdel'] == self::BATTLE_RAZDEL_GROUP) { if ($pl['min_lvl_2'] < 2) { $pl['min_lvl_2'] = 2; } if ($pl['max_lvl_2'] > 21) { $pl['max_lvl_2'] = 21; } if ($pl['teams'] == 2) { //Персонаж в заявке, подключаем ему противника //Ищем бота для групповых $xx2 = $this->countUsersInTeam2($pl['id']); if ($pl['bot2'] > 0 && $xx2 < $pl['tm2max']) { //Добавляем ботов за вторую команду $spb = Db::getColumn( 'select users.id from users left join stats on users.id = stats.id where bot = 3 and level = ? and battle = 0 and zv = 0' ); foreach ($spb as $botId) { if ($xx2 >= $pl['tm2max'] || rand(0, 10000) >= 5000 || rand(0, 10000) <= 5000) { continue; } $bt = $this->u->addNewbot(0, '', $botId); if ($bt == 0) { continue; } Db::sql('update stats set zv = ?, team = 2 where id = ?', [$pl['id'], $bt]); $xx2++; } } unset($xx2); } //генерируем команды $teams = []; $cols = []; $tmc = []; $users = Db::getRows('select team, id from stats where zv = ?', [$pl['id']]); foreach ($users as $user) { ${'tm' . $user['team']} .= $this->u->microLogin($user['id']) . ', '; $tmc[$user['team']]++; $teams[$user['team']][] = $this->u->microLogin($user['id']); } foreach ($teams as $id => $members) { $cols[$id] = count($members); $teams[$id] = !empty($cols[$id]) ? implode(', ', $members) : 'группа пока не набрана'; } if (!isset($zi['id']) && $this->u->room['zvsee'] == 0) { $rad = ' '; } $zvb .= $rad . '' . date('H:i', $pl['time']) . ' '; foreach ($teams as $id => $memberList) { $zvb .= '(' . $cols[$id] . '/' . $pl['tm' . $id . 'max'] . ') '; $zvb .= $memberList; $zvb .= ' ('; $zvb .= $pl['min_lvl_' . $id] == $pl['max_lvl_' . $id] ? $pl['min_lvl_' . $id] : $pl['min_lvl_' . $id] . '-' . $pl['max_lvl_' . $id]; $zvb .= ' ур.)'; if ($id !== array_key_last($teams)) { $zvb .= ' против '; } } $zvb .= ' тип боя: (таймаут: ' . ($pl['timeout'] / 60) . ' мин.) '; $zvb .= ' ' . $zv_comm . ' '; $zvb .= ' (Бой начнется через ' . $tmStart . ')
'; } $i++; } if ($i == 0) { //заявок нет if ($this->u->room['zvsee'] > 0) { echo '
В данном разделе нет ни одной заявки
'; } } else { if (!isset($zi['id']) && $this->u->room['zvsee'] == 0) { $html = <<


HTML; if ($r === self::BATTLE_RAZDEL_CHAOTIC) { if (!$this->u->info['no_zv_key']): ?>

Код подтверждения:
Код подтверждения:
u->info['level'] <= Config::get('bot_level')) { echo '
' . $zvb . '
'; } else { echo $html; } } } else { echo $zvb; } } } private function deleteComment($uid): int { if ( !isset($_GET['delcom']) || $_GET['delcom'] != $uid || !$this->u->newAct($_GET['key']) ) { return 0; } Db::sql('update zayvki set dcom = ? where id = ?', [$this->u->info['id'], $uid]); return $this->u->info['id']; } /** Считаем количество людей в конкретной заявке во второй команде. * @param int $frId id заявки * @return int */ private function countUsersInTeam2(int $frId): int { return Db::getValue('select count(*) from stats where zv = ? and team = 2', [$frId]); } public function go(int $id) { global $zi; if (empty($id) || !empty($this->u->info['battle'])) { return; } if (isset($zi['id'])) { $this->error = 'Вы не можете принять бой. Сначала отзовите свою заявку.'; return; } $z = Db::getRow( 'select * from zayvki where id = ? and start = 0 and cancel = 0 and time > unix_timestamp() - 60*60*2', [$id] ); if (!isset($z['id'])) { $this->error = 'Заявка на бой не найдена.'; return; } if ($z['razdel'] == self::BATTLE_RAZDEL_GROUP) { $this->joinGroup($z); } elseif ($z['razdel'] == self::BATTLE_RAZDEL_CHAOTIC) { $this->joinChaotic($z); } } /** Принять групповую заявку. * @param array $z заявка * @return void */ private function joinGroup(array $z) { $tm = 0; if (isset($_GET['tm1'])) { $tm = 1; } elseif (isset($_GET['tm2'])) { $tm = 2; } else { $this->error = 'Что-то здесь не так'; } if ($tm == 0) { return; } $t1 = $tm; $t2 = 1; $tmmax = 0; $cln = 0; if ($tm == 1) { $t2 = 2; } $clanTeamsCheck = Db::getRows( 'select clan, team from users left join stats on users.id = stats.id where zv = ?', [$z['id']] ); foreach ($clanTeamsCheck as $ctc) { if ($ctc['team'] == $t1) { $tmmax++; } if ( !empty($this->u->info['clan']) && $this->u->info['clan'] == $ctc['clan'] && $ctc['team'] == $t2 ) { $cln++; } } $error = null; if ($cln > 0) { $error = 'Вы не можете сражаться против сокланов'; } elseif ($z['bot2'] == 1 && $t1 == 2) { $error = 'Вы не можете сражаться на стороне ботов'; } elseif ($z['tm' . $t1 . 'max'] <= $tmmax) { $error = 'Группа уже набрана (' . ($z['tm' . $t1 . 'max'] - $tmmax) . ')'; } elseif ( $z['min_lvl_' . $t1] > $this->u->info['level'] || $z['max_lvl_' . $t1] < $this->u->info['level'] ) { $error = 'Вы не подходите по уровню, за эту команду могут зайти персонажи ' . $z['min_lvl_' . $t1] . ' - ' . $z['max_lvl_' . $t1] . ' уровня'; } elseif ($this->u->isWeakened()) { $error = 'Вы слишком ослаблены, восстановитесь'; } if ($error) { $this->error = $error; return; } Db::sql('update stats set zv = ?, team = ? where id = ?', [$z['id'], $t1, $this->u->info['id']]); $this->error = 'Вы приняли групповой бой...'; $this->u->info['zv'] = $z['id']; $this->u->info['team'] = $t1; } /** Присоединиться к хаотической заявке. * @param array $z заявка * @return void */ private function joinChaotic(array $z) { $error = null; $cols = $this->countUsersAll($z['id']); if ($cols >= $z['maxplayers']) { $error = 'Достигнут максимальный предел участников в этой заявке!'; } elseif ($this->testTravm() == 1 && $z['k'] != 1) { $error = 'Вы травмированы. С такими увечьями доступны кулачные бои.'; } elseif ($this->testTravm() == 2) { $error = 'Вы травмированы. С такими увечьями невозможно сражаться.'; } elseif ( !$this->u->info['no_zv_key'] && ( !isset($_SESSION['code2']) || $_SESSION['code2'] < 1 || ( $_POST['code21'] != $_SESSION['code2'] && $_POST['code22'] != $_SESSION['code2'] ) ) ) { $error = 'Неправильный код подтверждения'; } elseif ( $z['min_lvl_1'] > $this->u->info['level'] || $z['max_lvl_1'] < $this->u->info['level'] ) { $error = 'Вы не подходите по уровню, за эту команду могут зайти персонажи ' . $z['min_lvl_1'] . ' - ' . $z['max_lvl_1'] . ' уровня'; } elseif ($this->u->isWeakened()) { $error = 'Вы слишком ослаблены, восстановитесь'; } if ($error) { $this->error = $error; return; } $t1 = 0; if ($z['type'] == self::CHAOTIC_TYPE_PRIZED) { $this->joinPrizedChaotic(); } $this->u->info['login2'] = ''; $blnc = $this->u->stats['reting']; $z['tm' . $t1] += $blnc; Db::run('update stats set zv = ?, team = ? where id = ?', [$z['id'], $t1, $this->u->info['id']]); Db::sql('update users set login2 = ? where id = ?', [$this->u->info['login2'], $this->u->info['id']]); Db::sql('update zayvki set tm1 = ?, tm2 = ? where id = ?', [$z['tm1'], $z['tm2'], $z['id']]); $this->u->info['zv'] = $z['id']; $this->u->info['team'] = $t1; $this->error = 'Вы приняли хаотичный бой...'; } private function joinPrizedChaotic() { //============================================================================================= Призовые Db::sql( 'insert into users ( name, align, `real`, login, host_reg, pass, ip, ipreg, room, timereg, mail, sex, fnq, molch2, level ) values (?,?,1,?,0,?,?,?,422,unix_timestamp(),?,?,0,unix_timestamp() + 86400,8)', [ $this->u->info['name'], $this->u->info['align'], $this->u->info['login'], $this->u->info['pass'], IP, IP, 'haot@new-combats.com', $this->u->info['sex'], ] ); $uidb = Db::lastInsertId(); Db::sql('update users set inUser = ? where id = ?', [$uidb, $this->u->info['id']]); /** Классы: * 1 - Уворот * 2 - Крит * 3 - Танк * 4 - Топор * 5 - Маг земли * 6 - Маг воздуха */ $sellclass = rand(1, 6); $stmt1 = Db::prepare('update items_users set inOdet = ? where id = ?'); $stmt2 = Db::prepare( 'update items_users set `1price` = (select price_1 from items_shop where sid = 1 and items_shop.item_id = ?) where id = ?' ); $stmt3 = Db::prepare( 'insert into stats (id, stats, ability, skills, exp, priems) values (?,?,-75,-9,100000,?)' ); $classItems = [ 1 => [ 1 => 525, 2 => 539, 3 => 523, 14 => 523, 4 => 290, 5 => 541, 7 => 633, 8 => 647, 9 => 680, 10 => 685, 11 => 685, 12 => 685, 13 => 1151, 16 => 707, 17 => 712, ], 2 => [ 1 => 527, 2 => 537, 3 => 567, 14 => 723, 4 => 291, 5 => 544, 7 => 626, 8 => 651, 9 => 683, 10 => 686, 11 => 686, 12 => 686, 13 => 706, 16 => 708, 17 => 717, ], 3 => [ 1 => 533, 2 => 536, 3 => 558, 14 => 722, 4 => 291, 5 => 545, 7 => 628, 8 => 654, 9 => 684, 10 => 689, 11 => 689, 12 => 689, 13 => 700, 16 => 710, 17 => 718, ], 4 => [ 1 => 528, 2 => 538, 3 => 552, 14 => 552, 4 => 291, 5 => 543, 7 => 627, 8 => 653, 9 => 681, 10 => 687, 11 => 687, 12 => 687, 13 => 320, 16 => 709, 17 => 716, ], 5 => [ 1 => 531, 2 => 534, 3 => 1026, 4 => 291, 5 => 548, 7 => 629, 8 => 657, 9 => 674, 10 => 692, 11 => 692, 12 => 692, 13 => 699, 16 => 711, 17 => 714, ], 6 => [ 1 => 531, 2 => 534, 3 => 1026, 4 => 291, 5 => 548, 7 => 629, 8 => 658, 9 => 675, 10 => 693, 11 => 693, 12 => 693, 13 => 699, 16 => 711, 17 => 714, ], ]; $classStats = [ 1 => [ 's1=21|s2=31|s3=16|s4=30|rinv=40|m9=5|m6=10|s7=0|a1=10|a2=0|a3=0|a4=0|a5=0|mg1=0|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=0|s6=0', '193|8|217|221|6|213|14|220|141|232|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0', ], 2 => [ 's1=24|s2=20|s3=24|s4=30|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=0|a3=0|a4=9|a5=0|mg1=0|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=0|s6=0|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0', '193|204|221|138|9|188|240|215|147|232|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0', ], 3 => [ 's1=42|s2=3|s3=3|s4=50|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=0|a3=9|a4=0|a5=0|mg1=0|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=0|s6=0|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0', '11|204|233|226|45|14|139|221|6|232|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0', ], 4 => [ 's1=43|s2=15|s3=15|s4=25|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=10|a3=0|a4=0|a5=0|mg1=0|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=0|s6=0', '193|139|49|14|6|217|221|204|147|45|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0', ], 5 => [ 's1=14|s2=3|s3=3|s4=25|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=0|a3=0|a4=0|a5=3|mg1=0|mg2=0|mg3=0|mg4=6|mg5=0|mg6=0|mg7=0|s5=13|s6=40|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0', '208|117|170|44|113|128|122|249|246|147|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0', ], 6 => [ 's1=14|s2=3|s3=3|s4=25|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=0|a3=0|a4=0|a5=3|mg1=0|mg2=6|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=13|s6=40|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0', '208|93|98|260|39|263|257|104|30|147|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0', ], ]; /** @var array $classEffects * Эффекты:
* 1 - Сила;
* 7 - Интуиция;
* 8 - Ловкость;
* 9 - Интеллект;
* 20 - Сокрушение;
* 25 - Защита от оружия;
* 32 - Холодный разум;
* 37 - Нектар;
* 38 - Нектар отрицания;
* 53 - Магическое усиление воздуха;
* 54 - Магическое усиление земли;
* 283 - Бутерброд -Завтрак Рыцаря- толстый;
* 296 - Жажда Жизни +6;
* 439 - Магическое усиление общее;
*/ $classEffects = [ 1 => [8, 20, 25, 37, 38, 283, 296,], 2 => [7, 20, 25, 37, 38, 283, 296,], 3 => [1, 20, 25, 37, 38, 283, 296,], 4 => [1, 20, 25, 37, 38, 283, 296,], 5 => [9, 32, 54, 439, 25, 37, 38, 283, 296,], 6 => [9, 32, 53, 439, 25, 37, 38, 283, 296,], ]; foreach ($classEffects[$sellclass] as $classEffect) { Effects::addById($uidb, $classEffect); } $items = $classItems[$sellclass]; foreach ($items as $slot => $itemId) { $re = Helper\Conversion::dataStringToArray($itemId, $uidb); $stmt1->execute([$slot, $re]); $stmt2->execute([$itemId, $re]); } $stmt3->execute([$uidb, $classStats[$sellclass][0], $classStats[$sellclass][1]]); Db::sql('update users set money = -3000, money2 = 0 where id = ?', [$uidb]); //Корекция хп в призовых Db::sql('update stats set hpNow = hpAll, mpNow = mpAll where id = ?', [$uidb]); $this->u->info['id'] = $uidb; //============================================================================================= $this->error = 'Вы вселены в клона 8го левела'; //ТУТ вселяем в клона призовые хаоты //echo ''; - и где, блять, брать $btl_id ??? echo ''; } private function addGroupRequest() { } }