game/main.php
Ivor Barhansky bfd9e0c5a3 Refactor and optimize main.php script
The code cleanup included removing unnecessary lines and optimizing existing code snippets for better performance and readability. The script now uses a more efficient method of item generation and item pickup. The image loading process was revamped to provide a more efficient and user-friendly experience. Lastly, the HTML was reformatted into HEREDOC syntax for better readability.
2023-12-09 14:14:33 +00:00

644 lines
25 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
if (!defined('GAME_VERSION')) {
require_once '_incl_data/autoload.php';
}
use Core\{Config, Database, Db};
use User\ItemsModel;
use User\UserIp;
?>
<style>
/* Paste this css to your style sheet file or under head tag */
/* This only works with JavaScript,
if it's not present, don't show loader */
.no-js #loader {
display: none;
}
.js #loader {
display: block;
position: absolute;
left: 100px;
top: 0;
}
.se-pre-con {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 9999;
background: url(default.gif) center no-repeat #e2e0e1;
}
pre {
border: 1px solid gray;
border-radius: 5px;
padding: 3px 6px;
background: #cecece;
color: black;
font-family: Arial, sans-serif;
font-size: 12px;
}
</style>
<link href="<?= Config::img() ?>/css/main.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="/css/training/modal.css">
<div class="se-pre-con" id="se-pre-con"></div>
<?php
function var_info($vars, $d = false)
{
echo "<pre>\n";
var_dump($vars);
echo "</pre>\n";
if ($d) {
exit();
}
}
Database::init();
define('IP', UserIp::get());
$magic = new Magic();
$u = User::start();
$filter = new Filter();
$q = new Quests;
$code = PassGen::intCode(); //для ссылок вида ?rnd=XXXXXX, вроде как-то борется с кешированием, но это не точно.
//$training_manager = TrainingManager::getInstance($u->info['id']);
/** Восстанавливаем всем ботам, которые не в бою здоровье до максимума. */
Db::sql(
'update stats set hpNow = hpAll, mpNow = mpAll where id in (select id from users where bot = 2 and battle = 0)'
);
if ($u->info['banned'] > 0) {
header('location: /index.php');
die();
}
if ($u->info['bithday'] == '01.01.1800' && $u->info['inTurnirnew'] == 0) {
unset($_GET, $_POST);
}
#--------для общаги, и позже для почты
$sleep = $u->testAction('`vars` = "sleep" AND `uid` = "' . $u->info['id'] . '" LIMIT 1', 1);
if ($u->room['file'] != "room_hostel" && $u->room['file'] != "an/room_hostel" && !empty($sleep)) {
Db::sql('update actions set vars = ? where id = ?', ['unsleep', $sleep['id']]);
}
if ($u->room['file'] == "room_hostel" || $u->room['file'] == "post") {
$trololo = 0;
} else {
$trololo = 1;
}
#--------для общаги, и позже для почты
if (($u->info['online'] < time() - 60 || $u->info['afk'] != '')) {
$filter->setOnline(0, $u->info['id']);
Db::sql(
'update users set online = unix_timestamp(), timeMain = unix_timestamp(), afk = ? where id = ?',
['', $u->info['id']]
);
} elseif ($u->info['timeMain'] < time() - 60 || $u->info['afk'] != '') {
Db::sql(
'update users set online = unix_timestamp(), timeMain = unix_timestamp(), afk = ? where id = ?',
['', $u->info['id']]
);
}
if (!isset($u->info['id']) || ($u->info['joinIP'] == 1 && $u->info['ip'] != $_SERVER['HTTP_X_REAL_IP']) || $u->info['banned'] > 0) {
die(Config::get('exit'));
}
//Показываем системку и заносим данные
if ($u->info['battle_text'] != '' && $u->info['last_b'] > 0) {
Db::sql(
'insert into battle_last (battle_id, uid, time, act, lvl, align, clan, exp) values (?,?,unix_timestamp(),?,?,?,?,?)',
[
$u->info['last_b'],
$u->info['id'],
$u->info['last_a'],
$u->info['level'],
$u->info['align'],
$u->info['clan'],
$u->info['exp'],
]
);
}
if (!isset($_GET['mAjax']) && !isset($_GET['ajaxHostel'])) {
echo '<!DOCTYPE html>
<div style="padding-top:0; margin-top:17px; /*height:100%;*/ background-color:#e2e0e1;">';
}
$act = -2;
$act2 = 0;
$u->stats = $u->getStats($u->info['id'], 0);
$u->aves = ItemsModel::inventoryWeightAndItemQuantity();
if (!isset($u->stats['act'])) {
$u->stats['act'] = 0;
}
if ($u->stats['act'] == 1) {
$act = 1;
}
$u->rgd = $u->regen($u->info['id'], 0, 0);
//Проверка уровня
$ul = $u->testLevel();
if (isset($_GET['atak_user']) && $u->info['battle'] == 0 && $_GET['atak_user'] != $u->info['id']) {
if ($u->room['noatack'] == 0) {
$clan = Db::getValue('select clan from users where id = ?', [(int)$_GET['atak_user']]);
$cruw = Db::getRow(
'select id, type from clan_wars where ((clan1 = ? and clan2 = ?) or (clan1 = ? and clan2 = ?)) and time_finish > unix_timestamp() limit 1',
[
$clan,
$u->info['clan'],
$u->info['clan'],
$clan,
]
);
unset($clan);
if (isset($cruw['id'])) {
$cruw = $cruw['type'];
} else {
$cruw = 0;
}
$ua = Db::getRow(
'select * from users left join stats on users.id = stats.id where (atack > unix_timestamp() or atack = 1 or 1 = ? or 2 = ?) and stats.id = ?',
[
$cruw,
$cruw,
(int)$_GET['atak_user'],
]
);
$check = Db::getValue(
'select id from eff_users where id_eff = 478 and uid = ? and `delete` = 0 order by overType desc limit 1',
[$u->info['id']]
);
$check2 = Db::getValue(
'select id from eff_users where id_eff = 479 and uid = ? and `delete` = 0 order by overType desc limit 1',
[$ua['id']]
);
$check3 = Db::getValue(
'select id from battle_last where uid = ? and battle_id = ? limit 1', [$u->info['id'], $ua['battle']]
);
if ($ua['no_ip'] == 'trupojor' && $ua['level'] == 9 && $u->info['level'] > 9) {
$u->error = 'Нельзя нападать на монстра этого уровня!';
} elseif ($ua['no_ip'] == 'trupojor' && $ua['level'] == 10 && $u->info['level'] < 10) {
$u->error = 'Нельзя нападать на монстра этого уровня!';
} elseif ($ua['no_ip'] != 'trupojor' && $ua['level'] != $u->info['level']) {
$u->error = 'Нападать можно на персонажей только своего уровня!';
} elseif (isset($check3)) {
$u->error = 'Нельзя вмешаться, вы уже были в этом поединке.';
} elseif ($ua['no_ip'] == 'trupojor' && isset($check)) {
$u->error = 'Нельзя нападать на монстра чаще одного раза в 3 часа!';
} elseif (isset($check2)) {
$u->error = 'Персонаж имеет защиту от нападения!';
} elseif (isset($ua['id']) && $ua['online'] > time() - 520) {
$usta = $u->getStats($ua['id'], 0); // статы цели
$minHp = floor($usta['hpAll'] / 100 * 33); // минимальный запас здоровья цели при котором можно напасть
if ($ua['battle'] > 0) {
$uabt = Db::getRow(
'select id, type, invis from battle where id = ? and team_win = -1 limit 1', [$ua['battle']]
);
if (!isset($uabt['id'])) {
$ua['battle'] = 0;
}
}
if ($ua['battle'] == 0 && $minHp > $usta['hpNow']) {
$u->error = 'Нельзя напасть, у противника не восстановилось здоровье';
} elseif (isset($uabt['id']) && $uabt['type'] == 500 && $ua['team'] == 1) {
$u->error = 'Нельзя сражаться на стороне монстров!';
} elseif (isset($uabt['id']) && $uabt['invis'] > 0) {
$u->error = 'Нельзя вмешиваться в невидимый бой!';
} elseif ($magic->testTravma($ua['id'], 3)) {
$u->error = 'Противник тяжело травмирован, нельзя напасть!';
} elseif ($magic->testTravma($u->info['id'], 2)) {
$u->error = 'Вы травмированы, нельзя напасть!';
} elseif ($ua['room'] == $u->info['room'] && ($minHp <= $usta['hpNow'] || $ua['battle'] > 0)) {
if ($ua['type_pers'] == 0) {
if ($cruw == 2) {
$ua['type_pers'] = 99;
} else {
$ua['type_pers'] = 50;
}
}
if ($ua['no_ip'] == 'trupojor') {
$ua['type_pers'] = 500;
}
Db::sql(
'update stats set hpNow = ?, mpNow = ? where id = ?', [
$usta['hpNow'],
$usta['mpNow'],
$usta['id'],
]
);
$goodt = $magic->atackUser(
$u->info['id'], $ua['id'], $ua['team'], $ua['battle'], $ua['bbexp'], $ua['type_pers']
);
$sx = $u->info['sex'] ? 'a' : '';
if ($cruw == 2) {
$rtxt = '[img[items/pal_button9.gif]] &quot;' . $u->info['login'] . '&quot; совершил' . $sx . ' кровавое нападение по метке на персонажа &quot;' . $ua['login'] . '&quot;.';
} else {
$rtxt = '[img[items/pal_button8.gif]] &quot;' . $u->info['login'] . '&quot; совершил' . $sx . ' нападение по метке на персонажа &quot;' . $ua['login'] . '&quot;.';
}
if ($goodt > 0) {
$chatDto = new ChatMessage();
$chatDto->setCity($u->info['city']);
$chatDto->setRoom($u->info['room']);
$chatDto->setText($rtxt);
$chatDto->setType(6);
$chatDto->setTypeTime(1);
(new Chat())->sendMsg($chatDto);
}
unset($goodt);
header('location: main.php');
die();
} else {
if ($ua['room'] != $u->info['room']) {
//Персонаж в другой комнате
$u->error = 'Персонаж находится в другой комнате';
} else {
$u->error = 'Персонаж имеет слишком малый уровень жизней.';
}
}
} else {
//На персонажа нельзя напасть
$u->error = 'Персонаж не в игре, либо на нем нет метки';
}
} else {
$u->error = 'Вам запрещается атаковать без разрешения...';
}
}
if ($ul == 1) {
$act = 1;
}
/*-----------------------*/
if ($u->info['battle'] == 0) {
$btl_last = Db::getRow(
'select id, battle from battle_users where uid = ? and finish = 0 limit 1', [$u->info['id']]
);
}
if (isset($btl_last['id']) && $u->info['battle'] == 0) {
require_once('modules_data/btl_.php');
$u->info['battle_lsto'] = true;
} elseif ($u->info['battle'] == 0) {
//Проверка/Снятие предметов
if (!isset($sleep['id'])) {
$act2 = $u->testItems($u->info['id'], $u->stats, 0);
}
if ($act2 != -2 && $act == -2) {
$act = $act2;
}
if ($u->room['block_all'] != 0) {
unset($_GET['inv'], $_GET['skills'], $_GET['anketa']);
}
if (!isset($u->tfer['id']) && $u->room['block_all'] == 0) {
//Одеть/снять предмет
if (isset($_GET['rstv']) && isset($_GET['inv'])) {
$u->freeStatsMod($_GET['rstv'], $_GET['mf'], $u->info['id']);
} elseif (isset($_GET['ufs2']) && isset($_GET['inv'])) {
$u->freeStats2Item($_GET['itmid'], $_GET['ufs2'], $u->info['id'], 1);
} elseif (isset($_GET['ufs2mf']) && isset($_GET['inv'])) {
$u->freeStats2Item($_GET['itmid'], $_GET['ufs2mf'], $u->info['id'], 2);
} elseif (isset($_GET['ufsmst']) && isset($_GET['inv'])) {
$u->itemsSmSave($_GET['itmid'], $_GET['ufsmst'], $u->info['id']);
} elseif (isset($_GET['ufsms']) && isset($_GET['inv'])) {
$u->itemsSmSave($_GET['itmid'], $_GET['ufsms'] + 100, $u->info['id']);
} elseif (isset($_GET['ufs']) && isset($_GET['inv'])) {
$u->freeStatsItem($_GET['itmid'], $_GET['ufs'], $u->info['id']);
} elseif (isset($_GET['sid']) && isset($_GET['inv'])) {
$act = $u->snatItem($_GET['sid'], $u->info['id']);
} elseif (isset($_GET['oid']) && isset($_GET['inv'])) {
$act = $u->odetItem($_GET['oid'], $u->info['id']);
} elseif (isset($_GET['item_rune']) && isset($_GET['inv'])) {
$u->runeItem(null);
} elseif (isset($_GET['remitem'], $_GET['inv'])) {
$act = $u->snatItemAll($u->info['id']);
} elseif (isset($_GET['delete']) && isset($_GET['inv']) && $u->newAct($_GET['sd4'])) {
if ($u->info['allLock'] < time()) {
$u->deleteItem(intval($_GET['delete']), $u->info['id']);
} else {
echo '<script>setTimeout(function(){alert("Вам запрещено удалять предметы до ' . date(
'd.m.y H:i', $u->info['allLock']
) . '")},250);</script>';
}
} elseif (isset($_GET['unstack']) && isset($_GET['inv']) && $u->newAct($_GET['sd4'])) {
$u->unstack(intval($_GET['unstack']), intval($_GET['unstackCount']));
} elseif (isset($_GET['stack']) && isset($_GET['inv'])) {
$u->stack($_GET['stack']);
} elseif (isset($_GET['end_qst_now'])) {
$q->endq((int)$_GET['end_qst_now'], 'end');
}
//Использовать эффект
if (isset($_GET['use_pid'])) {
$magic->useItems((int)$_GET['use_pid']);
}
} else {
if ($u->room['block_all'] > 0) {
$u->error = 'В данной локации запрещено пользоваться чем-либо...';
}
}
}
if ($magic->youuse > 0) {
$act = 1;
}
//Получение статов
if ($act != -2) {
$u->stats = $u->getStats($u->info['id'], 0, 1);
$u->aves = ItemsModel::inventoryWeightAndItemQuantity();
if (!isset($sleep['id'])) {
$act2 = $u->testItems($u->info['id'], $u->stats, 0);
}
if ($act2 != -2 && $act == -2) {
$act = $act2;
}
}
/*-----------------------*/
if (isset($_GET['security']) && !isset($u->tfer['id']) && $trololo == 1) {
require_once('modules_data/_changepass.php');
} elseif (isset($_GET['friends']) && !isset($u->tfer['id'])) {
require_once('modules_data/_friends.php');
} elseif (($u->info['admin'] > 0 || $u->info['level'] > 7 || $u->info['align'] == 50) && isset($_GET['notepad']) && !isset($u->tfer['id'])) {
require_once('modules_data/notepad.php');
} elseif (isset($_GET['moderation'])) {
require_once('modules_data/_mod.php');
} elseif (isset($_GET['vip']) && !isset($u->tfer['id'])) {
require_once('modules_data/vip.php');
} elseif (
(
isset($_GET['zayvka']) &&
$u->info['battle'] == 0
) ||
(
isset($_GET['zayvka']) &&
(
$_GET['r'] == 6 ||
$_GET['r'] == 7 ||
!isset($_GET['r'])
) &&
$u->info['battle'] > 0
) &&
!isset($u->tfer['id'])
) {
require_once('modules_data/_zv.php');
} elseif (isset($_GET['alh']) && !isset($u->tfer['id'])) {
require_once('modules_data/_alh.php');
} elseif (isset($_GET['clan']) && !isset($u->tfer['id'])) {
require_once('modules_data/_clan.php'); //Панель кланов
} elseif (isset($_GET['alhp']) && ($u->info['admin'] == 1 || $u->info['align'] == 50) && !isset($u->tfer['id'])) {
require_once('modules_data/_alhp.php'); //Панель алхимиков
} elseif ($u->info['align'] > 0 && !isset($u->tfer['id']) && !empty($_GET['ap'])) {
require_once('modules_data/alignPanel.php'); //Панель склонностей, GET чтобы вызывать по ссылке.
} elseif ($u->info['battle'] != 0) {
//поединок
if ((!isset($btl_last['id']) || $u->info['battle'] > 0) && !isset($u->info['battle_lsto'])) {
require_once('modules_data/btl_.php');
echo '<script type="text/javascript" src="js/onlineList.js"></script>';
}
} else {
if (isset($_GET['talk']) && !isset($u->tfer['id'])) {
echo "<script>document.getElementById('se-pre-con').parentNode.removeChild(document.getElementById('se-pre-con'));</script>";
if ($u->info['dnow'] > 0) {
$d = new Dungeon;
}
require_once('modules_data/_dialog.php');
} elseif (isset($_GET['inv']) && !isset($u->tfer['id']) && $trololo == 1) {
require_once('modules_data/_inv.php');
} elseif (isset($_GET['add_eff']) && !isset($u->tfer['id']) && $trololo == 1) {
require_once('modules_data/add_eff.php');
} elseif (isset($_GET['referals']) && $trololo == 1 && !isset($u->tfer['id'])) {
require_once('modules_data/_ref.php');
} elseif (isset($_GET['obraz']) && !isset($u->tfer['id']) && $trololo == 1) {
require_once('modules_data/_obraz.php');
} elseif (isset($_GET['skills']) && !isset($u->tfer['id']) && $trololo == 1) {
require_once('modules_data/_umenie.php');
} elseif ((isset($_GET['transfer']) || isset($u->tfer['id'])) && $u->info['level'] >= Config::get(
'level_ransfer'
) && $trololo == 1 && $u->info['inTurnir'] == 0 && $u->info['inTurnirnew'] == 0) {
if ($u->info['allLock'] > time()) {
require_once('modules_data/_locations.php');
echo '<script>setTimeout(function(){alert("Вам запрещены передачи до ' . date(
'd.m.y H:i', $u->info['allLock']
) . '")},250);</script>';
} else {
require_once('modules_data/_transfers.php');
}
} elseif (isset($_GET['anketa']) && !isset($u->tfer['id']) && $trololo == 1) {
require_once('settings.php');
} elseif (isset($_GET['newanimal']) && $trololo == 1) {
require_once('modules_data/_newanimal.php');
} elseif (isset($_GET['act_trf']) && $u->room['block_all'] == 0) {
require_once('modules_data/act_trf.php');
} elseif (isset($_GET['titul']) && $u->room['block_all'] == 0) {
require_once('modules_data/titul.php');
} elseif (!isset($u->tfer['id'])) {
require_once('modules_data/_locations.php');
}
}
//Проверяем квесты на готовность
if (in_array(
$u->room['file'],
['dungeon_enter', 'dungeon_enter_all', 'enterbezdna', 'entercat', 'enterdrago', 'entergrib', 'enternizin', 'enterptp', 'house_belaun', 'dungeon']
)) {
$q->testquest();
}
$iloc = '';
$iloce = '';
$img = Config::img();
$sp = Db::getRows(
'select * from items_local where (room = ? or room = -1) and `delete` = 0 and user_take = 0 and tr_login = ?',
[$u->info['room'], $u->info['login']]
);
foreach ($sp as $pl) {
$itmo = Db::getRow('select id, name, img from items_main where id = ?', [$pl['item_id']]);
if (isset($itmo['id'])) {
$tk = 1;
$glid = 0;
//
if ($pl['room'] != -1 && $pl['room'] != $u->info['room']) {
if (isset($_GET['take_loc_item']) && $_GET['take_loc_item'] == $pl['id']) {
$iloce = 'Вы находитесь в другой комнате...';
}
$tk = 0;
} elseif ($pl['tr_login'] != '0' && $pl['tr_login'] != $u->info['login']) {
if (isset($_GET['take_loc_item']) && $_GET['take_loc_item'] == $pl['id']) {
$iloce = 'Данный предмет для другого персонажа...';
}
$tk = 0;
} elseif ($pl['tr_sex'] != -1 && $pl['tr_sex'] != $u->info['sex']) {
if (isset($_GET['take_loc_item']) && $_GET['take_loc_item'] == $pl['id']) {
$iloce = 'Данный предмет для противоположного пола...';
}
$tk = 0;
}
if ($pl['time'] + 86400 < time()) {
//Не успели поднять
$glid = 1;
Db::sql('update items_local set `delete` = unix_timestamp() where id = ?', [$pl['id']]);
} elseif (isset($_GET['take_loc_item']) && $_GET['take_loc_item'] == $pl['id']) {
//
if ($u->info['battle'] > 0 && $tk == 1) {
$iloce = 'Вы не можете поднять предмет, завершите поединок...';
} elseif ($tk == 1) {
$iloce = 'Вы успешно подняли предмет &quot;' . $itmo['name'] . '&quot; в локации &quot;' . $u->room['name'] . '&quot;.';
Db::sql(
'update items_local set `delete` = unix_timestamp(), user_take = ? where id = ?',
[$u->info['id'], $pl['id']]
);
//выдаем предмет
$glid = 1;
if ($pl['data'] == '0') {
ItemsModel::addItem(
$pl['item_id'], $u->info['id'], '|from_loc_id=' . $pl['id'] . '|from_loc=' . $u->info['room']
);
} else {
ItemsModel::addItem(
$pl['item_id'], $u->info['id'],
'|from_loc_id=' . $pl['id'] . '|from_loc=' . $u->info['room'] . '|' . $pl['data']
);
}
}
}
if ($glid == 0) {
if ($tk == 1 && $pl['tr_login'] == '0') {
$tk = 2;
}
$whoCanPickUp = '\n' . match (true) {
$pl['tr_login'] => "Предмет для игрока {$pl['tr_login']}",
$pl['tr_sex'] == 0 => 'Предмет для мужчин',
$pl['tr_sex'] == 1 => 'Предмет для женщин',
default => 'Предмет может подобрать каждый'
};
$iloc .= <<<HTML
<a class="tolobf$tk" href="/main.php?take_loc_item{$pl['id']}" target="main">
<div class="outer">
<div class="middle">
<div class="inner">
<img src="$img/i/items/{$itmo['img']}" title="Забрать «{$itmo['name']}». $whoCanPickUp" alt="">
</div>
</div>
</div>
</a>
HTML;
}
} else {
echo '[!]';
}
unset($tk, $itmo);
}
if ($iloc != '') {
if ($iloce != '') {
$iloc = '<div style="padding:10px; color: red;">' . $iloce . '</div>' . $iloc;
}
$iloc = <<<HTML
<style>
.tolobf0 {
display:inline-block;
width:80px;
height:80px;
background-color:#e5e5e5;
text-align:center;
}
.tolobf0:hover {
background-color:#d5d5d5;
text-align:center;
}
.tolobf2 {
display:inline-block;
width:80px;
height:80px;
background-color:#FFD700;
text-align:center;
}
.tolobf2:hover {
background-color:#DAA520;
text-align:center;
}
.tolobf1 {
display:inline-block;
width:80px;
height:80px;
background-color:#d5d5e5;
text-align:center;
}
.tolobf1:hover {
background-color:#d5d5d5;
text-align:center;
}
.outer {
display: table;
position: absolute;
height: 80px;
width: 80px;
}
.middle {
display: table-cell;
vertical-align: middle;
}
.inner {
margin-left: auto;
margin-right: auto;
width: 80px;
}
</style>
<h3>В комнате разбросаны предметы</h3>
HTML;
$tjs = $iloc;
} else {
$tjs = '';
}
unset($iloc, $iloce);
/*-----------------------*/
$spl = Db::getValue('select exp from levels where nextLevel = ? order by exp limit 1', [$u->info['level'] + 1]);
//Сломаное обучение. Как оно достало! Ins. 🤬
//$training_manager->render();
?>
<script>
top.myexpLineTop27('<?= $u->info['exp'] ?>', '<?= $spl ?>');
top.frames['main'].locitems = 1;
parent.$('#canal1').html('<?= $tjs ?>')
top.sd4key = "<?= $u->info['nextAct'] ?>";
var battle = <?= (int)$u->info['battle'] ?>;
top.hic();
//Loader
// Wait for window load
$(window).load(function () {
// Animate loader off screen
$(".se-pre-con").fadeOut(100);
});
</script>