'main.php', 20 => 'city.php', 21 => 'city.php', 22 => 'shop.php', 23 => 'repair.php', 26 => 'city.php', 27 => 'post.php', 29 => 'bank.php', 30 => 'clan_create.php', 31 => 'tower.php', 34 => 'fshop.php', 37 => 'gotzamok.php', 38 => 'gotzamok.php', 39 => 'gotzamok.php', 40 => 'gotzamok.php', 41 => 'gotzamok.php', 51 => 'city.php', 61 => 'akadem.php', 401 => 'hell.php', 402 => 'vxod.php', 403 => 'canalizaciya.php', //404 => 'vxod.php', 600 => 'c_haos.php', 601 => 'c_haos_in.php', 602 => 'c_park.php', 603 => 'aren_of_angels.php', 620 => 'enter_cave.php', 621 => 'cave.php', 650 => 'ul_clans.php', 660 => 'hostel.php', 661 => 'hostel_room.php', 662 => 'quest_room.php', 666 => 'jail.php', 760 => 'c_forest.php', 777 => 'obshaga.php', 1051 => 'lab_enter.php', 1052 => 'labirint.php', 1055 => 'group_arena.php', 2111 => 'city.php', 2601 => 'city.php', 2655 => 'city.php', 2702 => 'city.php' ]; private static array $fbattleCheckFiles = [ 'c_haos_in.php', 'c_haos.php', 'c_park.php', 'city.php', 'clan_castle.php', 'enter_cave.php', 'library.php', 'atk.php', 'podzem_dialog.php', 'post.php', 'shop.php', 'tournament.php', 'vxod.php', 'bank.php', 'canalizaciya,php', 'forest.php', 'main.php', 'repair.php', 'towerstamp.php', 'hell.php', 'ul_clans.php', 'labirint.php', 'akadem.php', 'towerin.php', 'user_anketa.php', 'zayavka.php', ]; private static array $towerinCheckFiles = [ 'main.php', 'city.php', 'tower.php' ]; private static array $roomsCheck = [22, 23, 27, 29, 30, 31, 37, 38, 39, 40, 41, 45, 53, 61, 401, 402, 600, 601, 602, 621, 650, 1051, 1052]; /** * Перемещение по комнатам. Header:Location уже включён. * * @param int $roomId ID куда идём. * @param int $roomIdCurrent ID откуда идём. */ public static function toRoom(int $roomId, int $roomIdCurrent): void { $eff = Db::getInstance()->fetchColumn('SELECT type FROM users_effects WHERE owner_id = ? AND (`type` = 10 OR `type` = 13 OR `type` = 14)', $_SESSION['uid']); $errors = []; if (UserEffect::isOverEncumbered($_SESSION['uid'])) { $errors[0] = 'У вас переполнен рюкзак, вы не можете передвигаться...'; } if ($eff == 10) { $errors[1] = 'Вы парализованы и не можете передвигаться...'; } if ($eff == 13 || $eff == 14) { $errors[2] = 'У вас тяжелая травма, вы не можете передвигаться...'; } if ($errors) { foreach ($errors as $error) { echo sprintf('%s', $error); } } elseif (in_array($roomId, self::allowedRoomMoves($roomIdCurrent))) { Db::getInstance()->execute('UPDATE users, online SET users.room = ?, online.room = ? WHERE `online`.`user_id` = `users`.`id` AND `online`.`user_id` = ?', [$roomId, $roomId, $_SESSION['uid']]); header('location: ' . self::$roomFileName[$roomId]); exit; } } /** * Проверка можно ли перейти из комнаты в комнату. * * @param int $roomId ID комнаты * * @return array|int[] */ private static function allowedRoomMoves(int $roomId): array { /* * 1 location: main.php?goto=arena * 2 Room 22 shop.php * 4 Room 23 repair.php * 6 Room 27 posr.php * 7 Room 21 [STREET] * 8 Room 26 [STREET] * 13 location: quest_room.php * 222 Room 2702 [STREET] */ $room[20] = [1, 21, 22, 23, 26, 27, 2702]; $room[1] = $room[22] = $room[23] = $room[27] = [20]; /* * 3 Room 2111 [STREET] * 4 Room 20 [STREET] * 5 Room 29 Bank.php * 13 Room 34 fshop.php * 14 Room 30 clan_create.php * 16 Room 31 tower.php * 650 Room 650 ul_clans.php */ $room[21] = [20, 29, 30, 31, 34, 650, 2111]; $room[29] = $room[30] = $room[31] = $room[34] = [21]; $room[26] = [20, 401, 660, 661, 777, 2601]; $room[401] = $room[660] = $room[661] = $room[777] = [26]; $room[2601] = [26, 37, 404, 1051, 2655]; $room[2655] = [603, 2601]; /* * 1 Room 21 [STREET] * 2 location: city.php?haos - где эта херня вообще? * 14 NULL * 21 NULL * 203 Room 1055 group_arena.php * [!not on map]666 Room 666 jail.php * 1000 */ $room[2111] = [21, 620, 666, 1055]; $room[2701] = [402, 2111]; $room[2702] = [20, 61]; if ($room[$roomId] === null) { return []; } return $room[$roomId]; } /** Проверки на соответствие скрипта и комнаты, которые были натыканы по всем файлам. * @param int $inRoom * @param int $inBattle * @param int $inTower * * @return void */ public static function roomRedirects(int $inRoom, int $inBattle, int $inTower = 0) { if ($inBattle && in_array(pathinfo(debug_backtrace()[0]['file'])['basename'], self::$fbattleCheckFiles)) { header('location: fbattle.php'); exit; } if ($inTower && in_array(pathinfo(debug_backtrace()[0]['file'])['basename'], self::$towerinCheckFiles)) { header('location: towerin.php'); exit; } // Если я в одной из этих комнат, // [И] Имя файла который инклюдит файл с проверкой не совпадает с именем файла локации в которой я нахожусь // [И] Номер комнаты который я пытаюсь открыть есть в списке проверяемых if (in_array($inRoom, self::$roomsCheck) && pathinfo(debug_backtrace()[0]['file'])['basename'] != self::$roomFileName[$inRoom] && in_array(array_search(pathinfo(debug_backtrace()[0]['file'])['basename'], self::$roomFileName), self::$roomsCheck)) { header('location: main.php'); exit; } } }