* Project name: Battles-Game */ use Battles\Chat; use Battles\Database\Db; use Battles\InventoryItem; use Battles\Travel; use Battles\User; use Battles\UserStats; require_once 'config.php'; if (empty($_SESSION['uid'])) { header("Location: index.php"); exit; } if (User::getInstance()->getBlock()) { exit('user blocked!'); } //Проверки на соответствие скрипта и комнаты, которые были натыканы по всем файлам. Travel::roomRedirects( User::getInstance()->getRoom(), User::getInstance()->getBattle(), User::getInstance()->getInTower() ); ///* // * Проверки на соответствие скрипта и комнаты, которые были натыканы по всем файлам. // */ //$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', //]; ////Может просто отовсюду? О_о //if (User::$current->getBattle() && in_array(pathinfo(debug_backtrace()[0]['file'])['basename'], $fbattleCheckFiles)) { // header('location: fbattle.php'); // exit; //} //$towerinCheckFiles = ['main.php', 'city.php', 'tower.php']; //if (User::$current->getInTower() && in_array(pathinfo(debug_backtrace()[0]['file'])['basename'], $towerinCheckFiles)) { // header('location: towerin.php'); // exit; //} //$roomsCheck = [22, 23, 25, 27, 29, 30, 31, 37, 38, 39, 40, 41, 45, 53, 61, 401, 402, 600, 601, 602, 621, 650, 1051, 1052]; //// Если я в одной из этих комнат, //// [И] Имя файла который инклюдит файл с проверкой не совпадает с именем файла локации в которой я нахожусь //// [И] Номер комнаты который я пытаюсь открыть есть в списке проверяемых //if (in_array(User::$current->getRoom(), $roomsCheck) // && pathinfo(debug_backtrace()[0]['file'])['basename'] != Travel::$roomFileName[User::$current->getRoom()] // && in_array(array_search(pathinfo(debug_backtrace()[0]['file'])['basename'], Travel::$roomFileName), $roomsCheck)) { // header('location: main.php'); // exit; //} if ( !empty($_GET['goto']) && !empty($_GET['tStamp']) && !empty($_GET['vcode']) && $_GET['vcode'] == md5(sha1($_GET['goto'] . $_GET['tStamp'])) ) { $query = 'update users u, online o set u.room = ?, o.room = ? where user_id = id and user_id = ?'; Db::getInstance()->execute($query, [$_GET['goto'], $_GET['goto'], User::getInstance()->getId()]); User::getInstance()->setRoom(intval($_GET['goto'])); } function createbot($bot, $login = null) { if (!User::getInstance($bot)->getId()) { return false; } $botname = $login ?: User::getInstance($bot)->getLogin(); Db::getInstance()->execute('insert into bots (name, prototype, hp) values (?, ?, ?)', [$botname, $bot, (new UserStats($bot))->getMaxHealth()]); return ["id" => Db::getInstance()->lastInsertId(), "login" => $botname]; } $var_map = [ 'cell_1' => 'Березовая роща', 'cell_2' => 'Березовая просека', 'cell_3' => 'Тёмный угол', 'cell_4' => 'Мрачная опушка', 'cell_5' => 'Тёмное урочище', 'cell_6' => 'Бурелом', 'cell_7' => 'Старая ива', 'cell_8' => 'Разнолесье', 'cell_9' => 'Сосновая тропа', 'cell_10' => 'Забытая дорога', 'cell_11' => 'Новая дорога', 'cell_12' => 'Мщаник', 'cell_13' => 'Ясная поляна', 'cell_14' => 'Заросший тракт', 'cell_15' => 'Смутный ельник', 'cell_16' => 'Сосновый бор', 'cell_17' => 'Тихоход', 'cell_18' => 'Сосновый гай', 'cell_19' => 'Смешаный лес', 'cell_20' => 'Темная поляна', 'cell_21' => 'Осенний угол', 'cell_22' => 'Грибное место', 'cell_23' => 'Опушка', 'cell_24' => 'Рыжий лес', 'cell_25' => 'Полесье', ]; const _BOTSEPARATOR_ = 10000000; function savecavedata($cavedata, $caveleader, $floor) { $f1 = fopen("cavedata/$caveleader-$floor.dat", "wb+"); flock($f1, LOCK_EX); fwrite($f1, serialize($cavedata)); flock($f1, LOCK_UN); fclose($f1); } function GiveExp($id, $exp) { User::getInstance($id)->addExperience($exp); } /** * Генератор прогрессбара. * @param $current - Текущее значение. * @param $maximum - Максимальное значение. * @param string $line_color - Цвет полоски прогрессбара. * @param string $bg_color - Фон прогрессбара. * @return string */ function showProgressBar($current, $maximum, string $line_color = 'limegreen', string $bg_color = 'silver'): string { $bar = round($current / $maximum * 100); return <<
$current / $maximum
HTML; } /** * Функция отображает слот для свитков в окне персонажа. * * @param $slot * * @throws \Krugozor\Database\Mysql\Exception */ function echoscroll($slot) { $all_magic = 0; if (User::getInstance()->getBattle()) { $script = 'fbattle'; $bat = db::c()->query('SELECT `magic` FROM `battle` WHERE `id` = ?i', User::getInstance()->getBattle())->fetch_assoc(); $all_magic = unserialize($bat['magic']); } else { $script = 'main'; } $dress = db::c()->query('SELECT `id`, `magic`, `name`, `img`, `duration`, `maxdur` FROM `inventory` WHERE `id` = ?i', User::getInstance()->$slot)->fetch_assoc(); $need_charge = db::c()->query('SELECT `needcharge` FROM `magic` WHERE `id` = ?i', $dress['magic'])->fetch_assoc(); if ((User::getInstance()->$slot > 0) && ($all_magic[User::getInstance()->getId()] < 1 || empty($need_charge['needcharge']))) { $row['id'] = User::getInstance()->$slot; if ($dress['magic']) { $magic = db::c()->query('SELECT targeted FROM `magic` WHERE `id` = ?i', $dress['magic'])->fetch_assoc(); echo ""; } echo << ACTIVE_SCROLL; } elseif ((User::getInstance()->$slot > 0) && ($all_magic[User::getInstance()->getId()] >= 1) && $need_charge['needcharge'] > 0) { echo << INACTIVE_SCROLL; } else { echo << EMPTY_SLOT; } } // ссылка на магию function showhrefmagic(array $dress): string { $magic = new Battles\Magic\Magic(Db::getInstance(), $dress['includemagic']); $r = ''; $script = User::getInstance()->getBattle() ? 'fbattle' : 'main'; $r .= "getMagic()->targeted == 1) { $r .= "okno('Введите название предмета', '{$script}.php?use={$dress['id']}', 'target')"; } elseif ($magic->getMagic()->targeted == 2) { $r .= "findlogin('" . $magic->getMagic()->name . "', '{$script}.php?use={$dress['id']}', 'target')"; } else { $r .= "if (confirm('Использовать сейчас?')) window.location='" . $script . ".php?use=" . $dress['id'] . "';"; } $r .= "\"href='#'>"; $r .= "На оружии выгравировано '{$dress['text']}'" : "") . "\">
"; return $r; } function timeOut($ttm): string { $out = ''; $time_still = $ttm; $tmp = floor($time_still / 2592000); $id = 0; if ($tmp > 0) { $id++; if ($id < 3) { $out .= $tmp . " мес. "; } $time_still = $time_still - $tmp * 2592000; } $tmp = floor($time_still / 86400); if ($tmp > 0) { $id++; if ($id < 3) { $out .= $tmp . " дн. "; } $time_still = $time_still - $tmp * 86400; } $tmp = floor($time_still / 3600); if ($tmp > 0) { $id++; if ($id < 3) { $out .= $tmp . " ч. "; } $time_still = $time_still - $tmp * 3600; } $tmp = floor($time_still / 60); if ($tmp > 0) { $id++; if ($id < 3) { $out .= $tmp . " мин. "; } } if ($out == '') { if ($time_still < 0) { $time_still = 0; } $out = $time_still . ' сек.'; } return $out; } /** * @param $time * @param $vars * @param $vls * @param $uid * * @return bool */ function addActions($time, $vars, $vls, $uid) { db::c()->query('LOCK TABLES `actions` WRITE'); $ins = db::c()->query('INSERT INTO `actions` (`uid`,`time`,`city`,`room`,`vars`,`ip`,`vals`) VALUES (?i, ?i, "?s", ?i, "?s", "?s", "?s")', $uid, $time, "capitalcity", 0, $vars, $_SERVER['REMOTE_ADDR'], $vls); db::c()->query('UNLOCK TABLES'); return $ins; } // использовать магию (встроить в предмет?) function usemagic($id, $target) { $user = Db::getInstance()->fetch('select * from users where id = ?', $_SESSION['uid']); $row = db::c()->query('SELECT * FROM `inventory` WHERE `owner` = ?i AND id = ?i', User::getInstance()->getId(), $id)->fetch_assoc_array(); $bat = db::c()->query('SELECT * FROM `battle` WHERE `id` = ?i', User::getInstance()->getBattle())->fetch_assoc_array(); $all_magic = unserialize($bat['magic']); $charge = 0; $magic = db::c()->query('SELECT * FROM `magic` WHERE `id` = ?i', $row['magic'])->fetch_assoc_array(); if ($magic['needcharge'] > 0) { $charge = $magic['needcharge']; } $incmagic = db::c()->query('SELECT * FROM `magic` WHERE `id` = ?i', $row['includemagic'])->fetch_assoc_array(); if ($incmagic['needcharge'] > 0) { $charge = $incmagic['needcharge']; } //Переделать под новую базу if (($all_magic[User::getInstance()->getId()] < 1 || $charge == 0) && ($user['sila'] >= $row['nsila'] && $user['lovk'] >= $row['nlovk'] && $user['inta'] >= $row['ninta'] && $user['vinos'] >= $row['nvinos'] && $user['intel'] >= $row['nintel'] && $user['level'] >= $row['nlevel'] && (($user['align'] > 7 && $user['align'] < 8) || ((int)$user['align'] == (int)$row['nalign']) || ($row['nalign'] == 0)) && $user['noj'] >= $row['nnoj'] && $user['topor'] >= $row['ntopor'] && $user['dubina'] >= $row['ndubina'] && $user['mec'] >= $row['nmech'] && ($row['type'] < 13 || $row['type'] == 50) && ($user['mfire'] >= $row['nfire']) && $user['mwater'] >= $row['nwater'] && $user['mair'] >= $row['nair'] && $user['mearth'] >= $row['nearth'] && $user['mlight'] >= $row['nlight'] && $user['mgray'] >= $row['ngray'] && $user['mdark'] >= $row['ndark'] && $row['needident'] == 0 ) || $row['magic'] == 48 || $row['magic'] == 50) { if (!$row['magic']) { $incmagic['name'] = $row['includemagicname']; $incmagic['cur'] = $row['includemagicdex']; $incmagic['max'] = $row['includemagicmax']; if ($incmagic['cur'] <= 0) { return false; } $magic['targeted'] = $incmagic['targeted']; echo ""; include("magic/" . $incmagic['file']); echo ""; } else { echo ""; include("magic/" . $magic['file']); echo ""; } if ($bat) { if ($row['maxdur'] <= ($row['duration'] + 1)) { InventoryItem::destroyItem($row['id']); } else { if (!$row['magic']) { $query = 'update inventory set includemagicdex = includemagicdex - ? where item_id = ?'; } else { $query = 'update inventory set durability = durability + ? where item_id = ?'; } Db::getInstance()->execute($query, [$bat, $row['id']]); } if (!$charge) { $charge = 0; } //ограничение по кол-ву за ход if (User::getInstance()->getBattle()) { $batMagic = Db::getInstance()->fetchColumn('select magic from battle where battle_id = ?', User::getInstance()->getBattle()); } if (empty($batMagic)) { $all_magic = []; } else { $all_magic = unserialize($batMagic); } $all_magic[User::getInstance()->getId()] += $charge; Db::getInstance()->execute('update battle set magic = ? where battle_id = ?', [serialize($all_magic), User::getInstance()->getBattle()]); } } return false; } /* ВАЖНО! (#44) * addch() и addchp() заменяются на Chat::class->sendSys($message, [optional]$receiver); * Для addchp() используется второй опциональный ключ. * Это 150+ вхождений в куче файлов, где надо менять структуру вызова функции из-за их несовместимости. * Возможно, приоритетом стоит сделать унификацию свитков нападения, которых самих около 20 и которые * по нескольку раз вызывают эти функции. */ function addch($text, $room = 0) { Chat::sendSys($text); } function addchp($text, $who, $room = 0) { Chat::sendSys($text, $who); } function err($t) { echo '' . $t . ''; }