game/_incl_data/class/FightRequest.php

1637 lines
67 KiB
PHP
Raw Normal View History

2022-12-19 20:22:19 +00:00
<?php
use Core\ArraySorter;
use Core\ComparsionHelper;
2022-12-30 19:03:37 +00:00
use Core\Config;
use Core\Db;
use FightRequest\FRHelper;
use Tournament\Tournament;
use Tournament\TournamentModel;
use User\Effects;
2022-12-19 20:22:19 +00:00
class FightRequest
{
2023-01-10 16:29:32 +00:00
private bool $backTest = false; // Для проверок хаотических поединков.
2022-12-30 19:03:37 +00:00
private static bool $bcktst;
private User $u;
public string $error = '';
public const BATTLE_RAZDEL_GROUP = 4;
public const BATTLE_RAZDEL_CHAOTIC = 5;
public const BATTLE_RAZDEL_CURRENT = 6;
public const BATTLE_RAZDEL_ENDED = 7;
public const BATTLE_RAZDEL_TOURNAMENTS = 10;
private const BATTLE_TYPE_MELEE = 1;
private const BATTLE_TYPE_NO_EKR_ITEMS = 51;
private const CHAOTIC_TYPE_PRIZED = 33;
2022-12-19 20:22:19 +00:00
/**
2023-01-10 16:29:32 +00:00
* Заявки на бой.
2022-12-19 20:22:19 +00:00
*/
public function __construct()
{
$this->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) {
2022-12-19 20:22:19 +00:00
Db::sql('update stats set zv = 0 where id = ?', [$this->u->info['id']]);
Db::sql('delete from zayvki where id = ?', [$this->u->info['zv']]);
}
}
}
2023-01-10 16:29:32 +00:00
$this->test(); //проверяем заявки
2022-12-19 20:22:19 +00:00
}
/** Считаем количество людей в конкретной заявке.
* @param int $frId id заявки
* @return int
*/
private function countUsersAll(int $frId): int
2022-12-19 20:22:19 +00:00
{
return Db::getValue('select count(*) from stats where zv = ?', [$frId]);
}
2022-12-19 20:22:19 +00:00
/** Считаем количество людей в конкретной заявке во второй команде.
* @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]);
2022-12-19 20:22:19 +00:00
}
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;
}
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'
2022-12-19 20:22:19 +00:00
);
foreach ($sp as $pl) {
$uz = Db::getRow(
'select users.id, * from users left join stats on users.id = stats.id where zv = ?',
[$pl['id']]
2022-12-19 20:22:19 +00:00
);
$i = [];
$toChat = '';
$toWhere = '';
foreach ($uz as $t) {
${'tm' . $t['team']} ??= [];
$i[$t['team']] ??= 0;
2022-12-19 20:22:19 +00:00
${'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']);
2022-12-19 20:22:19 +00:00
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);
2022-12-19 20:22:19 +00:00
}
}
}
2023-01-10 16:29:32 +00:00
/** Проверяем заявки
2022-12-19 20:22:19 +00:00
* @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) {
2022-12-19 20:22:19 +00:00
$this->u->info['zv'] = 0;
Db::sql('update stats set zv = 0 where id = ?', [$this->u->info['id']]);
}
}
$this->testGroupAndChaotic();
}
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
)
) {
2023-01-10 16:29:32 +00:00
//группа не набрана
2022-12-19 20:22:19 +00:00
$this->cancelGroup($zayavka, $toChat);
} else {
2023-01-10 16:29:32 +00:00
//Начинаем поединок
2022-12-19 20:22:19 +00:00
$this->startBattle($zayavka['id'], $toChat . '|-|' . $toWhere);
}
}
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']);
2022-12-19 20:22:19 +00:00
if ($pendingFightersCount < $requiredFightersToStartBattle) {
2023-01-10 16:29:32 +00:00
//группа не набрана
//Добавляем недостающих игроков
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';
2022-12-19 20:22:19 +00:00
$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]]
);
2022-12-19 20:22:19 +00:00
}
if (empty($botUsers)) {
2023-01-10 16:29:32 +00:00
$text = ' Не удалось начать поединок по причине: Группа не набрана. (' . $zayavka['id'] . ': 0 ' . $levelToExp[$zayavka['min_lvl_1']] . '-' . $levelToExp[$zayavka['max_lvl_1'] + 1] . ')';
2022-12-19 20:22:19 +00:00
$chat->sendsys($text, 'Merlin');
2023-01-10 16:29:32 +00:00
$this->cancelGroup($zayavka, $toChat, ' Боты проспали.');
2022-12-19 20:22:19 +00:00
} 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;
2022-12-19 20:22:19 +00:00
}
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++;
2022-12-19 20:22:19 +00:00
}
unset($botUsers, $botInfo, $botData, $bot);
if ($pendingBotsCount + $pendingFightersCount >= $requiredFightersToStartBattle) {
$this->backTest = true;
self::$bcktst = true;
}
}
} else {
2023-01-10 16:29:32 +00:00
//Начинаем поединок
2022-12-19 20:22:19 +00:00
$this->startBattle($zayavka['id'], $toChat . '|-|' . $toWhere);
}
}
/** Проверяем хаотичные и групповые бои [в этом городе ?] */
private function testCronGroupAndChaotic(): void
2022-12-19 20:22:19 +00:00
{
$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'
2022-12-19 20:22:19 +00:00
);
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']]
);
2022-12-19 20:22:19 +00:00
foreach ($users as $user) {
${'tm' . $user['team']} ??= [];
$i[$user['team']] ??= 0;
2022-12-19 20:22:19 +00:00
${'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'])
) {
2022-12-19 20:22:19 +00:00
continue;
}
$toChat = rtrim($toChat, ',');
$toWhere = ltrim($toWhere, 'OR ');
if ($zv['razdel'] == self::BATTLE_RAZDEL_GROUP) {
2022-12-19 20:22:19 +00:00
$this->testGroup($i, $zv, $toChat, $toWhere);
} else {
$this->testCronChaotic($zv, $toChat, $toWhere);
}
}
}
public function testCronZv()
{
$this->testCronGroupAndChaotic();
if ($this->backTest || self::$bcktst) {
self::$bcktst = false;
$this->testCronZv();
}
}
private function cancelGroup($zv, $uids, $debug = null)
2022-12-19 20:22:19 +00:00
{
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)) {
2022-12-19 20:22:19 +00:00
return;
}
$text = ' Не удалось начать поединок по причине: Группа не набрана!';
2022-12-19 20:22:19 +00:00
if ($zv['priz'] > 0) {
$pg = $this->cancelPrizedChaotic($zv);
if (!empty($pg[0])) {
$uids = $pg[0];
2022-12-19 20:22:19 +00:00
}
$text .= $pg[1];
2022-12-19 20:22:19 +00:00
}
$chat = new Chat();
$chat->sendsys($text . $debug, $uids);
}
private function cancelPrizedChaotic(array $zv): array
2022-12-19 20:22:19 +00:00
{
$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']]);
2023-04-15 23:54:34 +00:00
\Core\ConversionHelper::dataStringToArray(4754, $user['id']);
}
} else {
2023-04-15 23:54:34 +00:00
\Core\ConversionHelper::dataStringToArray(4754, $user['id']);
}
2022-12-19 20:22:19 +00:00
}
return [
$stmt2 ?? 0,
' Вы получаете Призовой Жетон (х1)',
];
}
private function addGroupRequest()
{
}
public function addGroupOrChaoticRequest(int $r)
{
if (!in_array($r, [self::BATTLE_RAZDEL_GROUP, self::BATTLE_RAZDEL_CHAOTIC])) {
2022-12-19 20:22:19 +00:00
return;
}
$k = (int)$_POST['k'];
2022-12-19 20:22:19 +00:00
$az = 1;
if ($this->testTravm() == 1 && $k !== 1) {
2023-01-10 16:29:32 +00:00
$this->error = 'Вы травмированы. С такими увечьями доступны кулачные бои.';
2022-12-19 20:22:19 +00:00
$az = 0;
} elseif ($this->testTravm() == 2) {
2023-01-10 16:29:32 +00:00
$this->error = 'Вы травмированы. С такими увечьями невозможно сражаться.';
2022-12-19 20:22:19 +00:00
$az = 0;
} elseif ($this->u->isWeakened()) {
2023-01-10 16:29:32 +00:00
$this->error = 'Вы еще слишком ослаблены чтобы начать новый бой';
2022-12-19 20:22:19 +00:00
$az = 0;
}
if ($this->u->info['zv'] > 0) {
$this->error = 'Вы уже находитесь в заявке.';
2022-12-19 20:22:19 +00:00
$az = 0;
}
if ($az === 0) {
2022-12-19 20:22:19 +00:00
return;
}
$timeout = (int)$_POST['timeout'];
2022-12-19 20:22:19 +00:00
$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) {
2022-12-19 20:22:19 +00:00
$nz['type'] = 1;
}
if ($k === 2) {
2022-12-19 20:22:19 +00:00
$nz['type'] = 6;
$nz['travmaChance'] = 100;
}
if (!in_array($timeout, [1, 2, 3, 4, 5])) {
$timeout = 3;
2022-12-19 20:22:19 +00:00
}
$nz['timeout'] = $timeout * 60;
2022-12-19 20:22:19 +00:00
$nz['razdel'] = $r;
$nz['comment'] = substr($_POST['cmt'], 0, 40);
$nz['comment'] = str_replace('"', '&quot;', $nz['comment']);
2022-12-19 20:22:19 +00:00
$gad = 1;
if ($r == self::BATTLE_RAZDEL_CHAOTIC) {
2023-01-10 16:29:32 +00:00
//хаотичный бой
2022-12-19 20:22:19 +00:00
if ($_POST['startime2']) {
$nz['time_start'] = (int)$_POST['startime2'];
2022-12-19 20:22:19 +00:00
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;
2022-12-19 20:22:19 +00:00
$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'])
)
) {
2023-01-10 16:29:32 +00:00
$this->error = 'Неправильный код подтверждения';
2022-12-19 20:22:19 +00:00
$gad = 0;
}
} else {
$gad = 0;
2023-01-10 16:29:32 +00:00
$this->error = 'Что-то не так...<br>';
2022-12-19 20:22:19 +00:00
}
} elseif ($r == self::BATTLE_RAZDEL_GROUP) {
2023-01-10 16:29:32 +00:00
//групповой бой
//здесь заносим и проверяем данные на гурпповой бой
2022-12-19 20:22:19 +00:00
if ($_POST['startime']) {
$nz['time_start'] = (int)$_POST['startime'];
if (!in_array($nz['time_start'], [300, 600, 900, 1200, 1800])) {
2022-12-19 20:22:19 +00:00
$nz['time_start'] = 600;
}
$nz['tm1max'] = ComparsionHelper::minimax((int)$_POST['nlogin1'], 1, 99);
$nz['tm2max'] = ComparsionHelper::minimax((int)$_POST['nlogin2'], 1, 99);
2022-12-19 20:22:19 +00:00
2023-01-10 16:29:32 +00:00
//Генерируем уровни союзника
$levels = FRHelper::getTeammatesLevel($_POST['levellogin1'], $this->u->info['level']);
$nz['min_lvl_1'] = $levels->min;
$nz['max_lvl_1'] = $levels->max;
2022-12-19 20:22:19 +00:00
2023-01-10 16:29:32 +00:00
//Генерируем уровни противника
$levels = FRHelper::getTeammatesLevel($_POST['levellogin2'], $this->u->info['level']);
$nz['min_lvl_2'] = $levels->min;
$nz['max_lvl_2'] = $levels->max;
2022-12-19 20:22:19 +00:00
} else {
$gad = 0;
2023-01-10 16:29:32 +00:00
$this->error = 'Что-то не так...<br>';
2022-12-19 20:22:19 +00:00
}
}
$bt2 = (int)$_POST['bots2'];
if ($bt2 != 0 && $r == self::BATTLE_RAZDEL_GROUP) {
2022-12-19 20:22:19 +00:00
$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'];
2022-12-19 20:22:19 +00:00
}
2022-12-19 20:22:19 +00:00
$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'],
2022-12-19 20:22:19 +00:00
$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);
2022-12-19 20:22:19 +00:00
$zid = Db::lastInsertId();
if ($zid) {
2022-12-19 20:22:19 +00:00
Db::sql('update stats set zv = ?, team = 1 where id = ?', [$zid, $this->u->info['id']]);
$this->u->info['zv'] = $zid;
2023-01-10 16:29:32 +00:00
$this->error = 'Заявка на бой подана';
2022-12-19 20:22:19 +00:00
} else {
2023-01-10 16:29:32 +00:00
$this->error = 'Ошибка: Заявка не подана!';
2022-12-19 20:22:19 +00:00
}
}
}
2023-01-28 02:24:37 +00:00
/**
* Звуковой пинг в чат?
* @return void
* @todo убрать колхоз с условиями когда станет ясно как оно работает.
2023-01-28 02:24:37 +00:00
*/
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);
}
public function startBattle($id, $vars = null)
2022-12-19 20:22:19 +00:00
{
// что это?
$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;
2022-12-19 20:22:19 +00:00
}
$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']]
2022-12-19 20:22:19 +00:00
);
// Разбивка на команды раньше зависела от равной суммы 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);
2022-12-19 20:22:19 +00:00
2023-01-10 16:29:32 +00:00
//обновляем заявку, что бой начался
Db::sql('update zayvki set start = unix_timestamp(), btl_id = ? where id = ?', [$btl_id, $z['id']]);
2022-12-19 20:22:19 +00:00
$this->u->info['battle'] = $btl_id;
2023-01-10 16:29:32 +00:00
//Отправляем сообщение в чат всем бойцам
$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 = 'Вы не можете начать поединок.';
2022-12-19 20:22:19 +00:00
} 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('<script>location="main.php?battle_id=' . $btl_id . '";</script>');
}
}
2022-12-19 20:22:19 +00:00
}
}
}
public function getCurrentStatus(array $zi, int $r)
2022-12-19 20:22:19 +00:00
{
// нахуй статус
// если у меня нет заявки
// если я в бою
// если я не в тех категориях
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;
2022-12-19 20:22:19 +00:00
}
$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 '<b>Ожидаем начала ' . $battleType[$zi['razdel']] . ' боя</b>';
echo '<br>Ваш бой начнется через ' . $tm_start . ' мин.';
}
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 .= '<img src="' . Config::img() . '/i/align/align' .
$tms[$g][$h]['align'] . '.gif">';
2022-12-19 20:22:19 +00:00
}
$tm2 .= '<b>' . $tms[$g][$h]['login'] . '</b> [' . $tms[$g][$h]['lvl'] . ']
<a href="info/' . $tms[$g][$h]['uid'] . '" target="_blank">
<img src="' . Config::img() . '/i/inf_capitalcity.gif" alt=""></a>, ';
2022-12-19 20:22:19 +00:00
}
$h++;
2022-12-19 20:22:19 +00:00
}
$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 .= ' <img width="20" height="20" src="' . Config::img() . '/i/flag.gif" title="Победа"> ';
2022-12-19 20:22:19 +00:00
}
$tm .= $tm2;
if ($k + 1 < count($ts) && $tm2 != '' && $ts[$k + 1] > 0) {
$tm .= ' <b style="color: red">против</b> ';
}
$k++;
2022-12-19 20:22:19 +00:00
}
}
if (!isset($btl_lst[$b['id']])) {
$btl_lst[$b['id']] = true;
if ($tm == '') {
$tm = 'Данные поединка потеряны';
2022-12-19 20:22:19 +00:00
}
$jk++;
$btl .= $jk . '. <span class=date>' . date(
'd.m.y H:i', $pl['time']
) . '</span> ' . $tm . ' <A HREF="logs.php?log=' . $pl['battle_id'] . '&rnd=' . $code . '" target=_blank>»»</A><br>';
2022-12-19 20:22:19 +00:00
}
}
}
$see .= empty($btl) ? '<div style="font-weight: bold;">В этот день не было боев, или же, летописец опять потерял свитки...</div><hr><br>' : $btl;
echo $see;
2022-12-19 20:22:19 +00:00
}
public function getCurrentBattlesList(): void
2022-12-19 20:22:19 +00:00
{
$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 '<div style="text-align: center;">К сожалению сейчас боев нет...</div>';
} 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 '<ol>';
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'];
2022-12-19 20:22:19 +00:00
}
}
if ($teamId !== array_key_first($teams)) {
continue;
2022-12-19 20:22:19 +00:00
}
$players .= '<strong style="color: red;"> против </strong>';
2022-12-19 20:22:19 +00:00
}
echo '<li><span class=date>' . date('d.m.y H:i', $timeStart) . '</span>';
echo " $players ";
echo '<img src="' . Config::img() . '/i/fighttype' . $typeBattle . '.gif" alt="">';
echo '<a href="' . Config::get('https') . '/logs.php?log=' . $battleId .
'&rnd=' . $code . '">▶▶</a>';
2022-12-19 20:22:19 +00:00
}
echo '</ol>';
2022-12-19 20:22:19 +00:00
}
}
public function getTournaments(): object
2022-12-19 20:22:19 +00:00
{
/** Турниры 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']);
}
}
2022-12-19 20:22:19 +00:00
# Формируем список идущих турниров.
$tournamentsList = Db::getRows('select * from tournaments');
$tournaments = '<ul>';
foreach ($tournamentsList as $tournament) {
$time = $tournament['start_time'] === -1 ? 'Турнир уже начался!' : date(
'G:i', $tournament['start_time']
);
$tournament_members_id = TournamentModel::getFreeFighters($tournament['tid']);
$members = [];
foreach ($tournament_members_id as $member) {
$members[] = TournamentModel::uidToLogin($member);
}
$tournaments .= sprintf(
"<li>Турнир для %d уровней.<br>Время подачи заявки: %s<br>Участники: %s</li>",
$tournament['tid'], $time, implode(', ', $members)
);
}
$tournaments .= '</ul>';
2022-12-19 20:22:19 +00:00
return (object)[
'hasTournaments' => !empty($tournamentsList),
'listTournaments' => $tournaments,
];
/** Конец турниров от Insallah. */
}
2022-12-19 20:22:19 +00:00
/** Дописывает значение после точки, если такового нет. 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';
}
2022-12-19 20:22:19 +00:00
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 .= ' (<a href="/main.php?zayvka=1&r=' . $pl['razdel'] . '&delcom=' . $pl['id'] . '&key=' . $this->u->info['nextAct'] . '&rnd=' . $code . '">удалить комментарий</a>)';
$pl['dcom'] = $this->deleteComment($pl['id']);
}
if ($pl['dcom'] > 0) {
$dl = ' <i style="color: grey">Комментарий удален модератором</i>';
if (!$this->u->isModerator()) {
$pl['comment'] = '';
2022-12-19 20:22:19 +00:00
}
}
$zv_comm = ' ' . $pl['comment'] . $dl . ' ';
} else {
$zv_comm = '';
}
2022-12-19 20:22:19 +00:00
$rad = '';
2022-12-19 20:22:19 +00:00
if ($pl['razdel'] == self::BATTLE_RAZDEL_CHAOTIC) {
$tm = '';
2022-12-19 20:22:19 +00:00
$uids = Db::getColumn('select id from stats where zv = ?', [$pl['id']]);
$cols = count($uids);
foreach ($uids as $uid) {
$tm .= $this->u->microLogin($uid) . ', ';
}
2022-12-19 20:22:19 +00:00
$tm = rtrim($tm, ', ');
if (!isset($zi['id']) && $this->u->room['zvsee'] == 0) {
$rad = '<input type="radio" name="btl_go" id="btl_go' . $pl['id'] . '" value="' . $pl['id'] . '"> ';
2022-12-19 20:22:19 +00:00
}
$n1tv = '';
$unvs = '';
if ($pl['invise'] == 1) {
$userslist = $this->u->isModerator() ? $tm : '';
$tm = '<span style="color:maroon">' . $this->u->microLogin($pl['creator']) . '</span>' .
$userslist . ' - <i>невидимый</i>';
$unvs = ' Участников: ' . $cols . ' чел. ';
$n1tv .= ' <img src="' . Config::img() . '/i/fighttypehidden0.gif" title="Невидимый">';
}
if ($pl['kingfight'] == 1) {
$n1tv .= ' <img src="' . Config::img() . '/king.gif" title="Призовой поединок">';
}
if ($pl['travmaChance'] == 100) {
$n1tv .= '<img src="' . Config::img() . '/fighttype6.gif" title="Кровавый поединок">';
}
if ($pl['noatack'] == 1) {
$n1tv .= ' <img src="' . Config::img() . '/i/fighttypehidden0.gif" title="Закрытый бой">';
}
if ($pl['nobot'] == 1) {
$n1tv .= ' <img src="' . Config::img() . '/nobot.gif" title="В бой не вступают боты">';
}
if ($pl['fastfight'] == 1) {
$n1tv .= ' <img src="' . Config::img() . '/fastfight.gif" title="Для начала боя необходимо минимум 2 игрока">';
}
if ($pl['noeff'] == 1) {
$n1tv .= ' <img src="' . Config::img() . '/svitok4.png" width="20" height="20" title="Запрет на использование свитков восстановления НР и маны">';
}
if ($pl['arand'] == 1) {
$n1tv .= ' <img src="' . Config::img() . '/random.png" width="20" height="20" title="Распределение бойцов случайным образом">';
}
if ($pl['noart'] == 1) {
$n1tv .= ' <img src="' . Config::img() . '/noart.png" width="20" height="20" title="Бой без артефактов">';
}
if ($pl['otmorozok'] == 1) {
$n1tv .= ' <img src="' . Config::img() . '/snow.gif" width="20" height="20" title="В бой могут вмешаться Отморозки">';
2022-12-19 20:22:19 +00:00
}
if ($pl['priz'] == 1) {
$zv_comm = ' <a href="/n/567/" target="_blank"><span style="color:firebrick;" title="Участники получают жетоны, чем больше призовых хаотов за сутки, тем больше падает жетонов за победу "><b>(Героическое Сражение)</b></span></a>';
2022-12-19 20:22:19 +00:00
}
if ($r == 5 && ($pl['creator'] == $this->u->info['id']) && $cols < 2 && $pl['priz'] == 0) {
$del_q = '&nbsp;&nbsp;<a href="/main.php?zayvka=1&r=' . $pl['razdel'] . '&del_z_time=' . $pl['id'] . '&rnd=' . $code . '">
<img src="' . Config::img() . '/i/clear.gif" title="Удалить заявку" alt=""></a>';
} else {
$del_q = '';
2022-12-19 20:22:19 +00:00
}
$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'] . ' ур. ';
2022-12-19 20:22:19 +00:00
}
$lvldt .= $cols . '/' . $pl['maxplayers'];
$zvb .= $rad . '<span class="date">' . date('H:i', $pl['time']) . '</span>
<span style="color: green; font-weight: bold; font-style: italic;">(' . $lvldt . ')</span>
тип боя: <IMG SRC="' . Config::img() . '/i/fighttype' . $pl['type'] . '.gif" WIDTH="20" HEIGHT="20" title="Хаотичный бой">
' . $n1tv . ' (таймаут <b>' . ($pl['timeout'] / 60) . ' мин.</b>) <b>' . $zv_comm . '</b>
<span class="dsc" style="font-style: italic; color: green;">(' . $unvs . 'Бой начнется через <B>' . $tmStart . '</B> мин.)</span>
<i>Участники:</i> ' . $tm . ' ' . $del_q . '<br>';
} 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'
2022-12-19 20:22:19 +00:00
);
foreach ($spb as $botId) {
if ($xx2 >= $pl['tm2max'] || rand(0, 10000) >= 5000 || rand(0, 10000) <= 5000) {
continue;
2022-12-19 20:22:19 +00:00
}
$bt = $this->u->addNewbot(0, '', $botId);
if ($bt == 0) {
continue;
2022-12-19 20:22:19 +00:00
}
Db::sql('update stats set zv = ?, team = 2 where id = ?', [$pl['id'], $bt]);
$xx2++;
2022-12-19 20:22:19 +00:00
}
}
unset($xx2);
2022-12-19 20:22:19 +00:00
}
//генерируем команды
$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']);
2022-12-19 20:22:19 +00:00
}
foreach ($teams as $id => $members) {
$cols[$id] = count($members);
$teams[$id] = !empty($cols[$id]) ? implode(', ', $members) : 'группа пока не набрана';
2022-12-19 20:22:19 +00:00
}
if (!isset($zi['id']) && $this->u->room['zvsee'] == 0) {
$rad = '<input type="radio" name="groupClick" id="groupClick" value="' . $pl['id'] . '"> ';
}
$zvb .= $rad . '<span class="date">' . date('H:i', $pl['time']) . '</span> ';
foreach ($teams as $id => $memberList) {
$zvb .= '(<span style="color: green;">' . $cols[$id] . '/<b>' . $pl['tm' . $id . 'max'] . '</b></span>) ';
$zvb .= $memberList;
$zvb .= '<span style="color: green; font-style: italic; font-weight: bold;"> (';
$zvb .= $pl['min_lvl_' . $id] == $pl['max_lvl_' . $id] ?
$pl['min_lvl_' . $id] : $pl['min_lvl_' . $id] . '-' . $pl['max_lvl_' . $id];
$zvb .= ' ур.)</span>';
if ($id !== array_key_last($teams)) {
$zvb .= ' <i>против</i> ';
}
}
$zvb .= ' тип боя: <IMG SRC="' . Config::img() . '/i/fighttype' . $pl['type'] . '.gif" WIDTH="20" HEIGHT="20" title="Групповой бой"> (таймаут: <b>' . ($pl['timeout'] / 60) . ' мин.</b>) ';
$zvb .= ' <b>' . $zv_comm . '</b> ';
$zvb .= ' <i style="color: green">(Бой начнется через <b>' . $tmStart . '</b>)</i><BR>';
}
$i++;
}
if ($i == 0) {
//заявок нет
if ($this->u->room['zvsee'] > 0) {
echo '<div style="margin-top: 32px; text-align: center; font-weight: bold;">В данном разделе нет ни одной заявки</div>';
2022-12-19 20:22:19 +00:00
}
} else {
if (!isset($zi['id']) && $this->u->room['zvsee'] == 0) {
$html = <<<HTML
<div style="float:left;">
<form method="post" style="margin:0;padding:0;" action="/main.php?zayvka=1&r=<?= $r ?>&rnd=<?= $code ?>"><br>
<input class="btn" type="submit" value="Принять вызов"><br><?= $zvb ?>
<input class="btn" style="margin-top:1px;" type="submit" value="Принять вызов">
</form>
</div>
HTML;
if ($r === self::BATTLE_RAZDEL_CHAOTIC) {
if (!$this->u->info['no_zv_key']): ?>
<div style="float:left;">
<form method="post" style="margin:0px;padding:0px;"
action="/main.php?zayvka=1&r=<?= $r ?>&rnd=<?= $code ?>"><br>
<img src="/show_reg_img/security2.php?id='<?= time() ?>" width="70" height="20">
Код подтверждения: <input style="width:40px;" type="text" name="code21">
<input class="btn" type="submit" value="Принять вызов"><br><?= $zvb ?>
<img src="/show_reg_img/security2.php?id=<?= time() ?>" width="70" height="20">
Код подтверждения: <input style="width:40px;" type="text" name="code22">
<input class="btn" style="margin-top:1px;" type="submit" value="Принять вызов">
</form>
</div>
<?php
else:
echo $html;
endif;
} else {
if (empty($zvb) || $this->u->info['level'] <= Config::get('bot_level')) {
echo '<div style="float:left;">' . $zvb . '</div>';
} else {
echo $html;
}
}
} else {
echo $zvb;
2022-12-19 20:22:19 +00:00
}
}
}
private function deleteComment($uid): int
2022-12-19 20:22:19 +00:00
{
if (
!isset($_GET['delcom']) ||
$_GET['delcom'] != $uid ||
!$this->u->newAct($_GET['key'])
) {
return 0;
2022-12-19 20:22:19 +00:00
}
Db::sql('update zayvki set dcom = ? where id = ?', [$this->u->info['id'], $uid]);
return $this->u->info['id'];
2022-12-19 20:22:19 +00:00
}
/** Принять групповую заявку.
* @param array $z заявка
* @return void
*/
private function joinGroup(array $z)
2022-12-19 20:22:19 +00:00
{
$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;
2022-12-19 20:22:19 +00:00
}
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;
2022-12-19 20:22:19 +00:00
}
/** Присоединиться к хаотической заявке.
* @param array $z заявка
* @return void
*/
private function joinChaotic(array $z)
2022-12-19 20:22:19 +00:00
{
$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 = 'Вы слишком ослаблены, восстановитесь';
}
2022-12-19 20:22:19 +00:00
if ($error) {
$this->error = $error;
return;
}
$t1 = 0;
if ($z['type'] == self::CHAOTIC_TYPE_PRIZED) {
$this->joinPrizedChaotic();
}
2022-12-19 20:22:19 +00:00
$this->u->info['login2'] = '';
$blnc = $this->u->stats['reting'];
$z['tm' . $t1] += $blnc;
2022-12-19 20:22:19 +00:00
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 = 'Вы приняли хаотичный бой...';
2022-12-19 20:22:19 +00:00
}
2022-12-19 20:22:19 +00:00
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'],
]
);
2022-12-19 20:22:19 +00:00
$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,?)'
);
2022-12-19 20:22:19 +00:00
$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,
],
];
2022-12-19 20:22:19 +00:00
$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',
],
];
2022-12-19 20:22:19 +00:00
/** @var array $classEffects
* Эффекты:<br>
* 1 - Сила;<br>
* 7 - Интуиция;<br>
* 8 - Ловкость;<br>
* 9 - Интеллект;<br>
* 20 - Сокрушение;<br>
* 25 - Защита от оружия;<br>
* 32 - Холодный разум;<br>
* 37 - Нектар;<br>
* 38 - Нектар отрицания;<br>
* 53 - Магическое усиление воздуха;<br>
* 54 - Магическое усиление земли;<br>
* 283 - Бутерброд -Завтрак Рыцаря- толстый;<br>
* 296 - Жажда Жизни +6;<br>
* 439 - Магическое усиление общее;<br>
*/
$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,],
];
2022-12-19 20:22:19 +00:00
foreach ($classEffects[$sellclass] as $classEffect) {
Effects::addById($uidb, $classEffect);
2022-12-19 20:22:19 +00:00
}
$items = $classItems[$sellclass];
foreach ($items as $slot => $itemId) {
2023-04-15 23:54:34 +00:00
$re = \Core\ConversionHelper::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 '<script>location="/main.php?battle_id=' . $btl_id . '";</script>'; - и где, блять, брать $btl_id ???
echo '<script>location="/main.php";</script>';
2022-12-19 20:22:19 +00:00
}
public function go(int $id)
2022-12-19 20:22:19 +00:00
{
global $zi;
if (empty($id) || !empty($this->u->info['battle'])) {
return;
}
2022-12-19 20:22:19 +00:00
if (isset($zi['id'])) {
2023-01-10 16:29:32 +00:00
$this->error = 'Вы не можете принять бой. Сначала отзовите свою заявку.';
return;
}
2022-12-19 20:22:19 +00:00
$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);
2022-12-19 20:22:19 +00:00
}
}
}