diff --git a/.htaccess b/.htaccess index 91a71035..be89ef87 100644 --- a/.htaccess +++ b/.htaccess @@ -41,9 +41,6 @@ DefaultLanguage ru RewriteRule ^clan/(.*)/?$ /clans_inf.php?$1 [L] RewriteRule ^clan/?$ /clans_inf.php [L] - RewriteRule ^ruins/(.*)/?$ /ruins.php?$1 [L] - RewriteRule ^ruins/?$ /ruins.php [L] - RewriteRule ^news/(.*)/?$ /n/$1 [R=301,L] RewriteRule ^news/?$ /n [R=301,L] diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 00000000..f4a650a3 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + mariadb + true + org.mariadb.jdbc.Driver + jdbc:mariadb://85.209.45.159:54001/game_production + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/_incl_data/class/Battle.php b/_incl_data/class/Battle.php index 913e2cd5..c1e98023 100644 --- a/_incl_data/class/Battle.php +++ b/_incl_data/class/Battle.php @@ -247,7 +247,7 @@ class Battle /** * @param int|null $experience - * @param bool $hardcore поединок с гарантированной травмой + * @param bool $hardcore поединок с гарантированной травмой * @return array|int[] */ public static function getType(?int $experience, bool $hardcore = false): array @@ -365,10 +365,10 @@ class Battle Db::sql( 'update stats set last_hp = ?, tactic7 = ? where id = ?', [ - $this->users[$this->uids[$uid]]['last_hp'], - $this->users[$this->uids[$uid]]['tactic7'], - $uid, - ] + $this->users[$this->uids[$uid]]['last_hp'], + $this->users[$this->uids[$uid]]['tactic7'], + $uid, + ] ); return (int)$hp; @@ -1139,9 +1139,9 @@ JS; /** * @param array $botLogins - * @param int $counter - * @param int $obr - * @param int $unique для совместимости с непонятным вызовом User->addAction + * @param int $counter + * @param int $obr + * @param int $unique для совместимости с непонятным вызовом User->addAction * при вызове уникального монстра. * @return void */ @@ -1231,14 +1231,14 @@ JS; /** Осторожно! Подключаются файлы!!! * Трогать очень осторожно. Этот шайтан как-то проверяет приёмы на враге * и рассчитывает урон учитывая и эти приёмы тоже. - * @param int $uid1 - * @param int $uid2 - * @param int $priem + * @param int $uid1 + * @param int $uid2 + * @param int $priem * @param $yron - * @param int $profil + * @param int $profil * @param bool $stabil * @param bool $test - * @param int $inlog + * @param int $inlog * @return float|int|mixed */ public function testYronPriem( @@ -1250,7 +1250,8 @@ JS; bool $stabil, bool $test = false, int $inlog = 0 - ): mixed { + ): mixed + { /** * profil = { @@ -1524,7 +1525,12 @@ JS; $jstext = json_encode($log['text']); $jsvars = json_encode($log['vars']); - $js = "add_log({$log['id']},0,$jstext,{$log['id_hod']},$jsvars);" . $js; + //old + //$js = "add_log({$log['id']},0,$jstext,{$log['id_hod']},0,0,$jsvars)" . $js; + //home + //$js = "add_log({$log['id']},0,$jstext,{$log['id_hod']},$jsvars);" . $js; + //work + $js = "add_log({$log['id']},$jstext,{$log['id_hod']},$jsvars);" . $js; } Db::sql('update stats set alog = ? where id = ?', [$u->info['alog'], $u->info['id']]); @@ -1589,8 +1595,15 @@ JS; $jstext = json_encode($log['text']); $jsvars = json_encode($log['vars']); - //$js = "add_mlog({$log['id']},0,$jstext,{$log['id_hod']},$jsvars);" . $js; - $js = "add_mlog({$log['id']},0,'{$log['text']}',{$log['id_hod']},'{$log['vars']}');" . $js; + $js = "add_mlog({$log['id']},0,$jstext,{$log['id_hod']},0,0,$jsvars)" . $js; + + //old + //$js = "add_mlog({$log['id']},0,$jstext,{$log['id_hod']},0,0,$jsvars)" . $js; + //home + ////$js = "add_mlog({$log['id']},0,$jstext,{$log['id_hod']},$jsvars);" . $js; + //$js = "add_mlog({$log['id']},0,'{$log['text']}',{$log['id_hod']},'{$log['vars']}');" . $js; + //work + $js = "add_mlog({$log['id']},$jstext,{$log['id_hod']},$jsvars)" . $js; } Db::sql('update stats set mlog = ? where id = ?', [$u->info['mlog'], $u->info['id']]); @@ -1920,17 +1933,6 @@ JS; } } - /** - * Массово встречается в подключаемых файлах приёмов. - * @param array $arr - * @return void - * @deprecated - */ - public function add_log(array $arr): void - { - Log::add($arr); - } - private function botAtack($uid, $pl, $tp): void { $testAttack = Db::getValue('select count(id) from battle_act where battle = ? and uid1 in (?,?) and uid2 in(?,?) and uid1 != uid2', [$this->i->id, $pl, $uid, $pl, $uid]) === 0; @@ -1963,8 +1965,6 @@ JS; } } - //Используем приемы - public function startAtack($id): void { global $u, $priem; @@ -2413,12 +2413,14 @@ JS; Db::sql('delete from battle_act where id = ?', [$id]); } + //Используем приемы + /** Осторожно! Подключаются файлы!!! - * @param array $pl + * @param array $pl * @param $u1 - * @param int $t + * @param int $t * @param int|array $u2 - * @param string $rznm + * @param string $rznm * @return void */ public function delPriem( @@ -2427,7 +2429,8 @@ JS; int $t = 1, int|array $u2 = 0, string $rznm = 'Очиститься Кровью' - ): void { + ): void + { global $u, $priem; if (!isset($pl['priem']['id']) || isset($this->del_val['eff'][$pl['priem']['id']])) { return; @@ -2484,8 +2487,6 @@ JS; $this->stats[$this->uids[$pl['uid']]] = $u->getStats($pl['uid'], 0, 0, false, false, true); } - //Повторная проверка приемов - /** * Расчет количества блоков и противников? * @param $uid @@ -2564,7 +2565,7 @@ JS; } } - //Проверка действия приема + //Повторная проверка приемов /** * Магия предметов? @@ -2597,7 +2598,7 @@ JS; } } - //Проверка урона приемов + //Проверка действия приема private function newRazmen($id): array { @@ -2618,6 +2619,8 @@ JS; return $at; } + //Проверка урона приемов + private function usersTestAtack($id, $uid1, $uid2): array { $r = []; @@ -2681,8 +2684,6 @@ JS; return $r; } - //Наносим удар между игроками - public function priemsRazmen(array|int $id, array|string $at): void { if ($at == 'fast') { @@ -2734,6 +2735,8 @@ JS; } } + //Наносим удар между игроками + /** Осторожно! Подключаются файлы!!! * @param $id * @param $at @@ -2955,10 +2958,6 @@ JS; return $at; } - - //Расчет типа удара от оружия - //Расчет урона от оружия - public function testPogB($uid, $yr, $pliid, $test = 0) { $checktuman = Db::getValue('select count(id) from eff_users where uid = ? and v2 in (273,286,287,288)', [$uid]) == 0; //проверка на туманный образ @@ -3059,6 +3058,8 @@ JS; return $yr2; } + + //Расчет типа удара от оружия //Расчет урона от оружия /** @@ -3226,8 +3227,7 @@ JS; return $at; } - - //Расчет защиты + //Расчет урона от оружия public function yhod_user($uid1, $uid2, $type) { @@ -3288,7 +3288,8 @@ JS; return $r; } - //Расчет защиты (магия) + + //Расчет защиты /** * Добавляем опыт \ нанесенный урон. @@ -3447,6 +3448,8 @@ JS; } } + //Расчет защиты (магия) + private function clearCache($uid): void { if ($uid <= 0 || isset($this->uclearc[$uid])) { @@ -3871,7 +3874,6 @@ JS; return '{' . $a . 'x' . $id . 'x' . $rnd . '}'; } - /** * Свиток спасения. * @@ -3998,7 +4000,8 @@ JS; $hodID, $tm1 = 0, $tm2 = 0 - ): void { + ): void + { $time = time(); if ($tm1 == 0) { $tm1 = isset($this->atacks[$id]) ? $this->atacks[$id]['time'] : $time; @@ -4032,8 +4035,6 @@ JS; Log::add($mas); } - //Расчет МФ - /** * Возращаем зоны блока? * @param $uid1 @@ -4050,6 +4051,8 @@ JS; } } + //Расчет МФ + private function saveStats($uid): void { Stats::saveBattleStats($this->stats[$this->uids[$uid]], $uid); @@ -4120,8 +4123,6 @@ JS; return $result ?: []; } - //Действия бота (атака) - /** * Смерть от пропуска ходов. Включается в конфиге. * @param int $id @@ -4154,7 +4155,7 @@ JS; } } - //Проверяем удары, приемы, свитки, зверей + //Действия бота (атака) private function addNewAtack(User $u): void { @@ -4240,7 +4241,7 @@ JS; } - //Действия бота + //Проверяем удары, приемы, свитки, зверей private function botAct($uid): bool { @@ -4257,6 +4258,19 @@ JS; return $r; } + //Действия бота + + /** + * Массово встречается в подключаемых файлах приёмов. + * @param array $arr + * @return void + * @deprecated + */ + public function add_log(array $arr): void + { + Log::add($arr); + } + /** * Запись выбранных ударов и блоков в массив $this->uAtc. * Технически это сеттер. diff --git a/_incl_data/class/Battle/Finish.php b/_incl_data/class/Battle/Finish.php index 0a55c7f4..5feb10da 100644 --- a/_incl_data/class/Battle/Finish.php +++ b/_incl_data/class/Battle/Finish.php @@ -10,6 +10,7 @@ use Core\Config; use Core\Db; use Delo; use ItemModel; +use Model\ActionModel; use User; use User\Clan; use User\Effects; @@ -54,7 +55,7 @@ class Finish } } } - + //данные о игроках в бою $t = Db::getRows( @@ -125,7 +126,7 @@ class Finish } $this->battle->i->setPlayerC(); - + Db::sql('update battle set players_c = ? where id = ?', [$this->battle->i->getPlayersC(), $this->battle->i->id]); if (!empty($vtvl)) { @@ -255,8 +256,7 @@ class Finish mysql_query( 'INSERT INTO `dungeon_items` (`dn`,`item_id`,`time`,`x`,`y`) VALUES ( - "' . $this->battle->users[$i]['dnow'] . '","' . $plik['item_id'] . '","' . (time( - ) - 600) . '","' . $this->battle->users[$i]['x'] . '","' . $this->battle->users[$i]['y'] . '" + "' . $this->battle->users[$i]['dnow'] . '","' . $plik['item_id'] . '","' . (time() - 600) . '","' . $this->battle->users[$i]['x'] . '","' . $this->battle->users[$i]['y'] . '" )' ); } @@ -488,8 +488,7 @@ class Finish 'UPDATE `users` SET `battle` = "0" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' ); mysql_query( - 'UPDATE `stats` SET `zv` = "0",`team` = "0",`exp` = `exp` + `battle_exp`,`battle_exp` = "0",`battle_yron` = "0",`enemy` = "0", `timeGo` = "' . time( - ) . '" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' + 'UPDATE `stats` SET `zv` = "0",`team` = "0",`exp` = `exp` + `battle_exp`,`battle_exp` = "0",`battle_yron` = "0",`enemy` = "0", `timeGo` = "' . time() . '" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' ); mysql_query('DELETE FROM `eff_users` WHERE `uid` = "' . $this->battle->users[$i]['id'] . '" LIMIT 100'); } @@ -687,8 +686,7 @@ class Finish } } mysql_query( - 'UPDATE `dungeon_bots` SET `delete` = "' . time( - ) . '" AND `inBattle` = "' . $this->battle->i->id . '" WHERE `dn` = "' . $this->battle->i->dnId . '" AND `for_dn` = "0" AND `delete` = "0" ' + 'UPDATE `dungeon_bots` SET `delete` = "' . time() . '" AND `inBattle` = "' . $this->battle->i->id . '" WHERE `dn` = "' . $this->battle->i->dnId . '" AND `for_dn` = "0" AND `delete` = "0" ' ); } else { //выкидываем всех игроков в клетку RESTART @@ -722,7 +720,7 @@ class Finish $this->expCoef += $this->battle->stats[$i]['pbe']; } - if ($this->battle->i->razdel == 5 && (Config::get('m') >= 6 && Config::get('m') <= 8 || Config::get('w') == 0 || Config::get('w') == 6)) { + if ($this->battle->i->razdel == 5 && (date('m') >= 6 && date('m') <= 8 || date('w') == 0 || date('w') == 6)) { $this->expCoef += 5; } @@ -911,11 +909,8 @@ class Finish $this->battle->users[$i]['battle_exp'] = floor($this->battle->users[$i]['battle_exp'] / 2); } if ($this->battle->users[$i]['animal'] > 0) { - $ulan = $u->testAction( - '`uid` = "' . $this->battle->users[$i]['id'] . '" AND `vars` = "animal_use' . $this->battle->i->id . '" LIMIT 1', - 1 - ); - if (isset($ulan['id']) && $this->battle->users[$i]['team'] == $this->battle->i->getTeamwin() && $this->battle->users[$i]['level'] > $ulan['vals']) { + $ulan = ActionModel::getOne(["uid = {$this->battle->users[$i]['id']}", "vars = animal_use{$this->battle->i->id}"], 'vals'); + if ($ulan['id'] && $this->battle->users[$i]['team'] == $this->battle->i->getTeamwin() && $this->battle->users[$i]['level'] > $ulan) { $a004 = mysql_fetch_array( mysql_query( 'SELECT `max_exp`,`name` FROM `users_animal` WHERE `uid` = "' . $this->battle->users[$i]['id'] . '" AND `id` = "' . $this->battle->users[$i]['animal'] . '" AND `pet_in_cage` = "0" AND `delete` = "0" LIMIT 1' @@ -1032,13 +1027,13 @@ class Finish ]; $admn = $admn[$this->battle->users[$i]['level']]; - if (Config::get('m') >= 6 && Config::get('m') <= 8) { + if (date('m') >= 6 && date('m') <= 8) { //Летний период - if (Config::get('w') == 0 || Config::get('w') == 5 || Config::get('w') == 6) { + if (date('w') == 0 || date('w') == 5 || date('w') == 6) { //Выходные дни $admn = $admn * 2; } - } elseif (Config::get('w') == 0 || Config::get('w') == 5 || Config::get('w') == 6) { + } elseif (date('w') == 0 || date('w') == 5 || date('w') == 6) { //Выходные дни $admn = $admn * 2; } @@ -1290,17 +1285,14 @@ class Finish } if ($this->battle->users[$i]['battle_yron'] > 0) { mysql_query( - 'INSERT INTO `eff_users` (`no_Ace`,`id_eff`,`overType`,`uid`,`name`,`data`,`timeUse`) VALUES ("1","478","111","' . $this->battle->users[$i]['id'] . '","Право на подвиг","pravonapodvig=1","' . time( - ) . '")' + 'INSERT INTO `eff_users` (`no_Ace`,`id_eff`,`overType`,`uid`,`name`,`data`,`timeUse`) VALUES ("1","478","111","' . $this->battle->users[$i]['id'] . '","Право на подвиг","pravonapodvig=1","' . time() . '")' ); } mysql_query( - 'INSERT INTO `actions`(`uid`, `time`, `city`, `room`, `vars`, `ip`, `vals`, `val`) VALUES ("' . $this->battle->users[$i]['id'] . '","' . time( - ) . '","capitalcity","' . $this->battle->users[$i]['room'] . '","end_trup"," ","","")' + 'INSERT INTO `actions`(`uid`, `time`, `city`, `room`, `vars`, `ip`, `vals`, `val`) VALUES ("' . $this->battle->users[$i]['id'] . '","' . time() . '","capitalcity","' . $this->battle->users[$i]['room'] . '","end_trup"," ","","")' ); mysql_query( - 'INSERT INTO `eff_users` (`no_Ace`,`id_eff`,`overType`,`uid`,`name`,`data`,`timeUse`) VALUES ("1","479","112","' . $u->info['id'] . '","Защита от нападения","zashitatk=1","' . time( - ) . '")' + 'INSERT INTO `eff_users` (`no_Ace`,`id_eff`,`overType`,`uid`,`name`,`data`,`timeUse`) VALUES ("1","479","112","' . $u->info['id'] . '","Защита от нападения","zashitatk=1","' . time() . '")' ); $ritem = rand(1, 1000); if ($ritem == 555) { @@ -1361,8 +1353,7 @@ class Finish 'UPDATE `rep` SET `rep3` = `rep3` + "' . $rzbvo . '" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' ); mysql_query( - 'INSERT INTO `actions`(`uid`, `time`, `city`, `room`, `vars`, `ip`, `vals`, `val`) VALUES ("' . $this->battle->users[$i]['id'] . '","' . time( - ) . '","capitalcity","' . $this->battle->users[$i]['room'] . '","end_xaot"," ","","")' + 'INSERT INTO `actions`(`uid`, `time`, `city`, `room`, `vars`, `ip`, `vals`, `val`) VALUES ("' . $this->battle->users[$i]['id'] . '","' . time() . '","capitalcity","' . $this->battle->users[$i]['room'] . '","end_xaot"," ","","")' ); } @@ -1467,7 +1458,7 @@ class Finish $this->battle->users[$i]['id'], ] ); - + if ($this->battle->i->turnir == 0) { //пишем в чат $cmsg->setTo($this->battle->users[$i]['login']); @@ -1514,17 +1505,19 @@ class Finish } - private function addItemToItemsLocal(int $itemId, int $uid, string $data = ''): void + /** + * Сохраняем лог в архив + * @return void + */ + private function saveLogs(): void { Db::sql( - "insert into items_local (room, time, item_id, data, tr_login, colvo) values (?,unix_timestamp(),?,?,?,1)", - [ - $this->battle->users[$this->battle->uids[$uid]]['room'], - $itemId, - $data, - $this->battle->users[$this->battle->uids[$uid]]['login'], - ] + 'insert into battle_logs_save select id, time, battle, id_hod, text, vars, zona1, zonb1, zona2, zonb2, type from battle_logs where battle = ? and id_hod <= ?', + [$this->battle->i->id, $this->battle->hodID] ); + Db::sql('delete from battle_logs where battle = ?', [$this->battle->i->id]); + Db::sql('delete from battle_stat where battle < ?', [$this->battle->i->id - 100]); + Db::sql('delete from battle_actions where btl = ?', [$this->battle->i->id]); } private function addGlobalItems($bid, $uid, $itm, $ico, $exp, $cr, $ecr): void @@ -1583,159 +1576,53 @@ class Finish $this->addGlobalItemItm($itm, $uid, $cmsg, $chat); } - /** - * Сохраняем лог в архив - * @return void - */ - private function saveLogs(): void + private function addGlobalItemsDropsOnMainStreet(int $bid, int $uid): void { - Db::sql( - 'insert into battle_logs_save select id, time, battle, id_hod, text, vars, zona1, zonb1, zona2, zonb2, type from battle_logs where battle = ? and id_hod <= ?', - [$this->battle->i->id, $this->battle->hodID] - ); - Db::sql('delete from battle_logs where battle = ?', [$this->battle->i->id]); - Db::sql('delete from battle_stat where battle < ?', [$this->battle->i->id - 100]); - Db::sql('delete from battle_actions where btl = ?', [$this->battle->i->id]); + //Выпадение дропа на ЦП + $mf = Db::getValue('select floor(count(id) / 20) as c from users where online > unix_timestamp() - 120'); + $mf = mt_rand(1, max($mf, 1)); + if ($bid == 1008) { + //Старый Новый Год + for ($i = 0; $i < $mf; $i++) { + if (mt_rand(0, 1) === 1) { + continue; + } + if (mt_rand(0, 86) <= 71) { + for ($j = 1; $j <= 7; $j++) { + $this->addItemToItemsLocal(1000, $uid, '|nosale=1|srok=259200'); + } + } else { + $customs = [911, 1172, 1173, 1461, 1462, 1463, 2141, 2142, 2143, 2144, 2870, 4037, 4038, 4039, 4040]; + $this->addItemToItemsLocal($customs[array_rand($customs)], $uid, '|nosale=1|srok=259200'); + } + } + } elseif ($bid == 1007) { + //Хэллоуин, Тыквоголовый CAPITAL CITY + for ($i = 0; $i < $mf; $i++) { + if (mt_rand(0, 1) === 1) { + continue; + } + $this->addItemToItemsLocal(4504, $uid); + } + } elseif ($bid == 1006 && mt_rand(1, 10) === 1 || in_array($bid, range(1000, 1004))) { + //Трупожор CAPITAL CITY + $this->addItemToItemsLocal(4451, $uid, 'srok=2592000'); + } + + } - private function dieInDungeon(int $dnr, int $i, User $u, ChatMessage $cmsg, Chat $chat): void + private function addItemToItemsLocal(int $itemId, int $uid, string $data = ''): void { - if ($dnr != 1) { - return; - } - - $vars = $this->battle->users[$i]['room'] == 370 ? 'dielaba' : 'die'; - $dies = Actions::countDungeon( - $this->battle->users[$i]['dnow'], - $this->battle->users[$i]['id'], - $vars + Db::sql( + "insert into items_local (room, time, item_id, data, tr_login, colvo) values (?,unix_timestamp(),?,?,?,1)", + [ + $this->battle->users[$this->battle->uids[$uid]]['room'], + $itemId, + $data, + $this->battle->users[$this->battle->uids[$uid]]['login'], + ] ); - Actions::addDungeon( - $this->battle->users[$i]['dnow'], - $this->battle->users[$i]['id'], - $this->battle->users[$i]['x'], - $this->battle->users[$i]['y'], - $vars - ); - - $la = $this->battle->users[$i]['sex'] == 1 ? 'ла' : ''; - - if ($dies < 2 || $this->battle->i->dungeon == 15) { - - $shaibaItemId = Db::getValue('select id from items_users where uid = ? and item_id = 4910 limit 1', [$this->battle->users[$i]['id']]); - - if ($shaibaItemId) { - //выбрасываем шайбу - ItemsModel::delete($shaibaItemId); - Db::sql( - "insert into dungeon_obj (name, dn, x, y, img, action, w, h, os1, os2, os3, date) - values ('Шайба',?,?,?,'shaiba.png','fileact:15/shaiba',120,220,5,8,12,?)", - [ - $this->battle->i->dnId, - $this->battle->users[$i]['x'], - $this->battle->users[$i]['y'], - "{use:'takeit',rt1:69,rl1:-47,rt2:74,rl2:126,rt3:76,rl3:140,rt4:80,rl4:150}", - ] - ); - } - - //телепортируем в рестарт (координата 0х0) - $this->battle->users[$i]['x'] = $this->battle->users[$i]['res_x']; - $this->battle->users[$i]['y'] = $this->battle->users[$i]['res_y']; - $this->battle->users[$i]['s'] = $this->battle->users[$i]['res_s']; - - $roomName = Db::getValue('select name from room where id = ?', [(int)$this->battle->users[$i]['room']]); - - $reviveRoomName = $this->battle->users[$i]['room'] == 370 ? 'начале лабиринта' : "комнате «{$roomName}»"; - $rtxt = "{$this->battle->users[$i]['login']} трагически погиб$la и находится в $reviveRoomName"; - - } elseif ($this->battle->i->dungeon == 102) { - $nld = ''; - $lab = Db::getRow('select id, users from laba_now where id = ?', [$this->battle->users[$i]['id']]); - - if ($lab['users'] < 2) { - //Удаляем подземелье - Db::sql('delete from laba_now where id = ?', [$lab['id']]); - Db::sql('delete from laba_map where id = ?', [$lab['id']]); - Db::sql('delete from laba_obj where lib = ?', [$lab['id']]); - Db::sql('delete from laba_act where lib = ?', [$lab['id']]); - Db::sql('delete from laba_itm where lib = ?', [$lab['id']]); - } else { - $lab['users']--; - mysql_query( - 'UPDATE `laba_now` SET `users` = "' . $lab['users'] . '" WHERE `id` = "' . $lab['id'] . '" LIMIT 1' - ); - } - mysql_query( - 'UPDATE `stats` SET `dnow` = "0" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' - ); - mysql_query( - 'UPDATE `users` SET `room` = "369" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' - ); - //удаляем все предметы которые пропадают после выхода из пещеры - mysql_query( - 'UPDATE `items_users` SET `delete` = "' . time( - ) . '" WHERE `uid` = "' . $this->battle->users[$i]['id'] . '" AND `delete` < 1234567890 AND `inShop` = "0" AND (`dn_delete` = "1" OR `data` LIKE "%fromlaba=1%")' - ); - if ($this->battle->users[$i]['login'] != '') { - if ($this->battle->users[$i]['sex'] == 0) { - $rtxt = '' . $this->battle->users[$i]['login'] . ' трагически погиб без права на воскрешение и покидает подземелье' . $nld; - } else { - $rtxt = '' . $this->battle->users[$i]['login'] . ' трагически погибла без права на воскрешение и покидает подземелье' . $nld; - } - } - } else { - $tinf = mysql_fetch_array( - mysql_query( - 'SELECT `uid` FROM `dungeon_now` WHERE `id` = "' . $this->battle->i->dnId . '" LIMIT 1' - ) - ); - $nld = ''; - if ($tinf['uid'] == $this->battle->users[$i]['id']) { - $tinf = mysql_fetch_array( - mysql_query( - 'SELECT `id` FROM `stats` WHERE `dnow` = "' . $this->battle->i->dnId . '" AND `hpNow` >= 1 LIMIT 1' - ) - ); - if (isset($tinf['id'])) { - $tinf = mysql_fetch_array( - mysql_query( - 'SELECT `id`,`login` FROM `users` WHERE `id` = "' . $tinf['id'] . '" LIMIT 1' - ) - ); - $nld .= ', новым лидером становится "' . $tinf['login'] . '"'; - mysql_query( - 'UPDATE `dungeon_now` SET `uid` = "' . $tinf['id'] . '" WHERE `id` = "' . $this->battle->i->dnId . '" LIMIT 1' - ); - } - } - - mysql_query( - 'UPDATE `stats` SET `dnow` = "0" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' - ); - mysql_query( - 'UPDATE `users` SET `room` = "321" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' - ); - //удаляем все предметы которые пропадают после выхода из пещеры - mysql_query( - 'UPDATE `items_users` SET `delete` = "' . time() . '" WHERE `uid` = "' . $this->battle->users[$i]['id'] . '" AND `dn_delete` = "1" LIMIT 1000' - ); - mysql_query( - 'UPDATE `items_users` SET `delete` = "' . time() . '" WHERE `uid` = "' . $u->info['id'] . '" AND `item_id` = "1189" OR `item_id` = "4447" OR `item_id` = "1174") LIMIT 1000' - ); - - if ($this->battle->users[$i]['sex'] == 0) { - $rtxt = '' . $this->battle->users[$i]['login'] . ' трагически погиб без права на воскрешение и покидает подземелье' . $nld; - } else { - $rtxt = '' . $this->battle->users[$i]['login'] . ' трагически погибла без права на воскрешение и покидает подземелье' . $nld; - } - } - if (!empty($rtxt)) { - $cmsg->setDn($this->battle->i->dnId); - $cmsg->setText($rtxt); - $cmsg->setTypeTime(1); - $chat->sendMsg($cmsg); - } } private function addGlobalItemsIco(string $ico, int $uid, ChatMessage $cmsg, Chat $chat): void @@ -1862,40 +1749,143 @@ class Finish } } - private function addGlobalItemsDropsOnMainStreet(int $bid, int $uid): void + private function dieInDungeon(int $dnr, int $i, User $u, ChatMessage $cmsg, Chat $chat): void { - //Выпадение дропа на ЦП - $mf = Db::getValue('select floor(count(id) / 20) as c from users where online > unix_timestamp() - 120'); - $mf = mt_rand(1, max($mf, 1)); - if ($bid == 1008) { - //Старый Новый Год - for ($i = 0; $i < $mf; $i++) { - if (mt_rand(0, 1) === 1) { - continue; - } - if (mt_rand(0, 86) <= 71) { - for ($j = 1; $j <= 7; $j++) { - $this->addItemToItemsLocal(1000, $uid, '|nosale=1|srok=259200'); - } - } else { - $customs = [911, 1172, 1173, 1461, 1462, 1463, 2141, 2142, 2143, 2144, 2870, 4037, 4038, 4039, 4040]; - $this->addItemToItemsLocal($customs[array_rand($customs)], $uid, '|nosale=1|srok=259200'); - } - } - } elseif ($bid == 1007) { - //Хэллоуин, Тыквоголовый CAPITAL CITY - for ($i = 0; $i < $mf; $i++) { - if (mt_rand(0, 1) === 1) { - continue; - } - $this->addItemToItemsLocal(4504, $uid); - } - } elseif ($bid == 1006 && mt_rand(1, 10) === 1 || in_array($bid, range(1000, 1004))) { - //Трупожор CAPITAL CITY - $this->addItemToItemsLocal(4451, $uid, 'srok=2592000'); + if ($dnr != 1) { + return; } + $vars = $this->battle->users[$i]['room'] == 370 ? 'dielaba' : 'die'; + $dies = Actions::countDungeon( + $this->battle->users[$i]['dnow'], + $this->battle->users[$i]['id'], + $vars + ); + Actions::addDungeon( + $this->battle->users[$i]['dnow'], + $this->battle->users[$i]['id'], + $this->battle->users[$i]['x'], + $this->battle->users[$i]['y'], + $vars + ); + $la = $this->battle->users[$i]['sex'] == 1 ? 'ла' : ''; + + if ($dies < 2 || $this->battle->i->dungeon == 15) { + + $shaibaItemId = Db::getValue('select id from items_users where uid = ? and item_id = 4910 limit 1', [$this->battle->users[$i]['id']]); + + if ($shaibaItemId) { + //выбрасываем шайбу + ItemsModel::delete($shaibaItemId); + Db::sql( + "insert into dungeon_obj (name, dn, x, y, img, action, w, h, os1, os2, os3, date) + values ('Шайба',?,?,?,'shaiba.png','fileact:15/shaiba',120,220,5,8,12,?)", + [ + $this->battle->i->dnId, + $this->battle->users[$i]['x'], + $this->battle->users[$i]['y'], + "{use:'takeit',rt1:69,rl1:-47,rt2:74,rl2:126,rt3:76,rl3:140,rt4:80,rl4:150}", + ] + ); + } + + //телепортируем в рестарт (координата 0х0) + $this->battle->users[$i]['x'] = $this->battle->users[$i]['res_x']; + $this->battle->users[$i]['y'] = $this->battle->users[$i]['res_y']; + $this->battle->users[$i]['s'] = $this->battle->users[$i]['res_s']; + + $roomName = Db::getValue('select name from room where id = ?', [(int)$this->battle->users[$i]['room']]); + + $reviveRoomName = $this->battle->users[$i]['room'] == 370 ? 'начале лабиринта' : "комнате «{$roomName}»"; + $rtxt = "{$this->battle->users[$i]['login']} трагически погиб$la и находится в $reviveRoomName"; + + } elseif ($this->battle->i->dungeon == 102) { + $nld = ''; + $lab = Db::getRow('select id, users from laba_now where id = ?', [$this->battle->users[$i]['id']]); + + if ($lab['users'] < 2) { + //Удаляем подземелье + Db::sql('delete from laba_now where id = ?', [$lab['id']]); + Db::sql('delete from laba_map where id = ?', [$lab['id']]); + Db::sql('delete from laba_obj where lib = ?', [$lab['id']]); + Db::sql('delete from laba_act where lib = ?', [$lab['id']]); + Db::sql('delete from laba_itm where lib = ?', [$lab['id']]); + } else { + $lab['users']--; + mysql_query( + 'UPDATE `laba_now` SET `users` = "' . $lab['users'] . '" WHERE `id` = "' . $lab['id'] . '" LIMIT 1' + ); + } + mysql_query( + 'UPDATE `stats` SET `dnow` = "0" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' + ); + mysql_query( + 'UPDATE `users` SET `room` = "369" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' + ); + //удаляем все предметы которые пропадают после выхода из пещеры + mysql_query( + 'UPDATE `items_users` SET `delete` = "' . time() . '" WHERE `uid` = "' . $this->battle->users[$i]['id'] . '" AND `delete` < 1234567890 AND `inShop` = "0" AND (`dn_delete` = "1" OR `data` LIKE "%fromlaba=1%")' + ); + if ($this->battle->users[$i]['login'] != '') { + if ($this->battle->users[$i]['sex'] == 0) { + $rtxt = '' . $this->battle->users[$i]['login'] . ' трагически погиб без права на воскрешение и покидает подземелье' . $nld; + } else { + $rtxt = '' . $this->battle->users[$i]['login'] . ' трагически погибла без права на воскрешение и покидает подземелье' . $nld; + } + } + } else { + $tinf = mysql_fetch_array( + mysql_query( + 'SELECT `uid` FROM `dungeon_now` WHERE `id` = "' . $this->battle->i->dnId . '" LIMIT 1' + ) + ); + $nld = ''; + if ($tinf['uid'] == $this->battle->users[$i]['id']) { + $tinf = mysql_fetch_array( + mysql_query( + 'SELECT `id` FROM `stats` WHERE `dnow` = "' . $this->battle->i->dnId . '" AND `hpNow` >= 1 LIMIT 1' + ) + ); + if (isset($tinf['id'])) { + $tinf = mysql_fetch_array( + mysql_query( + 'SELECT `id`,`login` FROM `users` WHERE `id` = "' . $tinf['id'] . '" LIMIT 1' + ) + ); + $nld .= ', новым лидером становится "' . $tinf['login'] . '"'; + mysql_query( + 'UPDATE `dungeon_now` SET `uid` = "' . $tinf['id'] . '" WHERE `id` = "' . $this->battle->i->dnId . '" LIMIT 1' + ); + } + } + + mysql_query( + 'UPDATE `stats` SET `dnow` = "0" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' + ); + mysql_query( + 'UPDATE `users` SET `room` = "321" WHERE `id` = "' . $this->battle->users[$i]['id'] . '" LIMIT 1' + ); + //удаляем все предметы которые пропадают после выхода из пещеры + mysql_query( + 'UPDATE `items_users` SET `delete` = "' . time() . '" WHERE `uid` = "' . $this->battle->users[$i]['id'] . '" AND `dn_delete` = "1" LIMIT 1000' + ); + mysql_query( + 'UPDATE `items_users` SET `delete` = "' . time() . '" WHERE `uid` = "' . $u->info['id'] . '" AND `item_id` = "1189" OR `item_id` = "4447" OR `item_id` = "1174") LIMIT 1000' + ); + + if ($this->battle->users[$i]['sex'] == 0) { + $rtxt = '' . $this->battle->users[$i]['login'] . ' трагически погиб без права на воскрешение и покидает подземелье' . $nld; + } else { + $rtxt = '' . $this->battle->users[$i]['login'] . ' трагически погибла без права на воскрешение и покидает подземелье' . $nld; + } + } + if (!empty($rtxt)) { + $cmsg->setDn($this->battle->i->dnId); + $cmsg->setText($rtxt); + $cmsg->setTypeTime(1); + $chat->sendMsg($cmsg); + } } public function getBtlstatus(): array diff --git a/_incl_data/class/BotPriemLogic.php b/_incl_data/class/BotPriemLogic.php index c78d80f2..784f4ea9 100644 --- a/_incl_data/class/BotPriemLogic.php +++ b/_incl_data/class/BotPriemLogic.php @@ -1,6 +1,7 @@ getRequirement(); @@ -125,8 +125,8 @@ class BotPriemLogic } if ($pl['xuse'] > 0) { - $xu = $u->testAction('`vars` = "use_priem_' . BotLogic::$bot['battle'] . '_' . BotLogic::$bot['id'] . '" AND `vals` = "' . $pl['id'] . '" LIMIT ' . $pl['xuse'] . '', 2); - if ($xu[0] >= $pl['xuse']) { + $xu = ActionModel::testCount(['vars = ' . 'use_priem_' . BotLogic::$bot['battle'] . '_' . BotLogic::$bot['id'], "vals = {$pl['id']}",], $pl['xuse']); + if ($xu >= $pl['xuse']) { $notr++; } } diff --git a/_incl_data/class/Core/Config.php b/_incl_data/class/Core/Config.php index 056ab7b9..ad337cec 100644 --- a/_incl_data/class/Core/Config.php +++ b/_incl_data/class/Core/Config.php @@ -2,14 +2,16 @@ namespace Core; +use DateTime; + class Config { const EKR_RUB_PRICE = 30; const KR_TO_EKR_EXCHANGE = 500; const EKR_TO_KR_EXCHANGE = 200; + private const HOSTNAME = 'new-combats.tech'; + public const GAMENAME = 'Новый Бойцовский Клуб'; private static self $instance; - private static string $hostname = 'new-combats.tech'; - private static string $gamename = 'Бойцовский Клуб'; private function __construct() { @@ -27,75 +29,51 @@ class Config private static function subdomain(string $name): string { - return DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR . $name . '.' . self::$hostname; + return DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR . $name . '.' . self::HOSTNAME; } public static function get(?string $key = null) { - $c['ver'] = '1.8.3.7'; + $c['ver'] = '0.8.2 alpha'; /* Конфигурации игры */ - $c['name'] = 'Новый «' . self::$gamename . '»'; - $c['title'] = $c['name'] . ' - Бесплатная,браузерная онлайн игра'; //Название игры - $c['title2'] = ' - Бесплатная, онлайн игра посвященная сражениям и магии!'; - $c['title3'] = $c['name']; - $c['keys'] = self::$gamename . ', combats.com, ' . self::$gamename . ' игра, ' . self::$gamename . ' играть, игра ' . self::$gamename . ', старый ' . self::$gamename . ', ' . self::$gamename . ' онлайн игра, ' . self::$gamename . ' браузерная игра, играть в ' . $c['name'] . ', игра бк, бк игра, старый бк, играть в бк, бк онлайн игра, новый бк, Легендарный ' . $c['name'] . ', легендарный бк, combats, комбатс, combats ru, combats com, OldBK, oldbk ru, oldbk com, олдбк, old bk, олд бк, mycombats, rebk, recombats, oldcombats, obk2'; //Ключевые слова META - $c['desc'] = self::$gamename . ' – это бесплатная увлекательная браузерная онлайн игра 2004-2009г, в которой сконцентрировано все самое лучшее от современных онлайн игр. В этой браузерной игре заложены самые интересные традиции всем известной онлайн игры под названием «' . self::$gamename . ' 2004-2009», которая, кстати, стала первооткрывателем всех браузерных игр.'; //Описание META - $c['footer'] = $c['name'] . ' © 2013-' . date('Y'); + $c['title'] = self::GAMENAME . ' - Бесплатная, браузерная онлайн игра'; //Название игры + $c['keys'] = self::GAMENAME . ', combats.com, ' . self::GAMENAME . ' игра, ' . self::GAMENAME . ' играть, игра ' . self::GAMENAME . ', старый ' . self::GAMENAME . ', ' . self::GAMENAME . ' онлайн игра, ' . self::GAMENAME . ' браузерная игра, играть в ' . self::GAMENAME . ', игра бк, бк игра, старый бк, играть в бк, бк онлайн игра, новый бк, Легендарный ' . self::GAMENAME . ', легендарный бк, combats, комбатс, combats ru, combats com, OldBK, oldbk ru, oldbk com, олдбк, old bk, олд бк, mycombats, rebk, recombats, oldcombats, obk2'; //Ключевые слова META + $c['desc'] = self::GAMENAME . ' – это бесплатная увлекательная браузерная онлайн игра 2004-2009г, в которой сконцентрировано все самое лучшее от современных онлайн игр. В этой браузерной игре заложены самые интересные традиции всем известной онлайн игры под названием «' . self::GAMENAME . ' 2004-2009», которая, кстати, стала первооткрывателем всех браузерных игр.'; //Описание META + $c['footer'] = self::GAMENAME . ' © 2013-' . date('Y'); //Сервера - $c['host'] = self::$hostname; + $c['host'] = self::HOSTNAME; $c['forum'] = self::subdomain('forum'); - $c['img'] = 'img.' . self::$hostname; - $c['thiscity'] = 'capitalcity'; - $c['capitalcity'] = self::$hostname; - $c['abandonedplain'] = self::$hostname; - $c['https'] = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR . self::$hostname; + $c['img'] = 'img.' . self::HOSTNAME; + $c['https'] = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR . self::HOSTNAME; $c['img2'] = self::subdomain('img'); - $c['lib'] = self::subdomain('lib'); $c['exit'] = ""; - $c['support'] = 'support@' . $c['host']; - - - //Валюта - $c['curency_name'] = 'RUB'; - $c['curency_value'] = 30; + $c['support'] = 'support@' . self::HOSTNAME; //Бот клон $c['bot_level'] = 0; // до какого лвл бот (включительно) $c['propsk_die'] = 0; //Смерть при пропуске ходов, 0 - выкл. , >= 1 - количество пропусков до смерти при нападении - //Скупка $c['exp'] = 0; //бонус опыта - $c['shop_type1'] = 100; //в гос НЕ ТРОГАТЬ + + //Скупка $c['shop_type2'] = 90; //в березку НЕ ТРОГАТЬ $c['shop_all'] = 0; //Скупка на все! , 0 - сделать для отключения скупки. $c['shop_all_type1'] = 100; //Скупка только с госе! , 0 - сделать для отключения скупки. $c['shop_all_type2'] = 100; //Скупка только с березки! , 0 - сделать для отключения скупки. // - $c['nosanich'] = true; //Странички Саныча не выпадают - true , выпадают - false - $c['zuby'] = false; //зубы + $c['limitedexp'] = false; //лимит опыта $c['expstop'] = 2999999; //9; //Опыт на котором останавливаемся 11 149999999 $c['expstopu'] = 2999999; //Опыт на котором останавливаемся $c['noobgade'] = false; //нуб квест (пещера) - $c['level_ransfer'] = 8; //С какого уровня разрешены передачи - + $c['level_transfer'] = 8; //С какого уровня разрешены передачи $c['noitembuy'] = false; //Не требует ресурсы для покупки $c['effz'] = 0; //Скольким секундам равен заряд $c['money_haot'] = true; //кр за хаоты - $c['crtoecr'] = 500; //Курс обмена кр на екр (если 0, то выключено) - $c['ecrtocr'] = 200; //Курс обмена екр на кр $c['bonuslevel'] = true; //Бонус уровня $c['bonussocial'] = false; //Бонус социальный - $c['w'] = date('w'); - $c['m'] = date('m'); - - $c['counters'] = ''; - $c['counters_noFrm'] = ''; - $c['securetime'] = 0; //Время последнего возможного взлома персов (подбор пароля по базам данных других игр) - - $c['copyright'] = 'Copyright © ' . date('Y') . ' « Новый Бойцовский Клуб »'; $c['db_host'] = 'db'; $c['db_user'] = 'prod1'; $c['db_name'] = 'game_production'; @@ -110,4 +88,9 @@ class Config } return self::$instance; } + + public static function getCopyright(): string + { + return '©' . (new DateTime())->format('Y') . ' Copyright «' . self::GAMENAME . '». All Rights Reserved.'; + } } diff --git a/_incl_data/class/Core/TOTP.php b/_incl_data/class/Core/TOTP.php new file mode 100644 index 00000000..c984b62b --- /dev/null +++ b/_incl_data/class/Core/TOTP.php @@ -0,0 +1,69 @@ +base32_decode($this->secret); + $binaryTime = pack('N*', 0) . pack('N*', $time); + $hash = hash_hmac('sha1', $binaryTime, $secretKey, true); + $offset = ord($hash[strlen($hash) - 1]) & 0x0F; + $otp = ( + ((ord($hash[$offset]) & 0x7F) << 24) | + ((ord($hash[$offset + 1]) & 0xFF) << 16) | + ((ord($hash[$offset + 2]) & 0xFF) << 8) | + (ord($hash[$offset + 3]) & 0xFF) + ) % 10 ** $digits; + return str_pad((string)$otp, $digits, '0', STR_PAD_LEFT); + } + + private function base32_decode(string $input): string + { + $base32charsFlipped = array_flip(str_split(self::BASE32CHARS)); + $output = ''; + $v = 0; + $vbits = 0; + + for ($i = 0, $j = strlen($input); $i < $j; $i++) { + $v <<= 5; + if ($input[$i] == '=') continue; + $v += $base32charsFlipped[$input[$i]]; + $vbits += 5; + + if ($vbits >= 8) { + $vbits -= 8; + $output .= chr(($v & (0xFF << $vbits)) >> $vbits); + } + } + return $output; + } +} diff --git a/_incl_data/class/Dungeon.php b/_incl_data/class/Dungeon.php index 4601ca67..db3363a4 100644 --- a/_incl_data/class/Dungeon.php +++ b/_incl_data/class/Dungeon.php @@ -2,6 +2,7 @@ use Core\Db; use Helper\Conversion; +use Model\ActionModel; use User\ItemsModel; use User\Stats; @@ -413,7 +414,7 @@ class Dungeon if ($usr_real['clan'] > 0) { $usrreal .= ''; } - $usrreal .= '' . $usr_real['login'] . '[' . $usr_real['level'] . ']'; + $usrreal .= '' . $usr_real['login'] . '[' . $usr_real['level'] . ']'; } else { $mereal = 'Невидимка[??]'; } @@ -425,7 +426,7 @@ class Dungeon if ($me_real['clan'] > 0) { $mereal .= ''; } - $mereal .= '' . $me_real['login'] . '[' . $me_real['level'] . ']'; + $mereal .= '' . $me_real['login'] . '[' . $me_real['level'] . ']'; } else { $mereal = 'Невидимка[??]'; } @@ -540,7 +541,7 @@ class Dungeon if ($usr_real['clan'] > 0) { $usrreal .= ''; } - $usrreal .= '' . $usr_real['login'] . '[' . $usr_real['level'] . ']'; + $usrreal .= '' . $usr_real['login'] . '[' . $usr_real['level'] . ']'; } else { $mereal = 'Невидимка[??]'; } @@ -552,7 +553,7 @@ class Dungeon if ($me_real['clan'] > 0) { $mereal .= ''; } - $mereal .= '' . $me_real['login'] . '[' . $me_real['level'] . ']'; + $mereal .= '' . $me_real['login'] . '[' . $me_real['level'] . ']'; } else { $mereal = 'Невидимка[??]'; } @@ -876,7 +877,7 @@ class Dungeon $i = count($a); } } elseif ($s[0] == 'repl_ptp') { - require_once('dnaction/_dungeon_replace.php'); + require_once 'dnaction/_dungeon_replace.php'; die(); } elseif ($s[0] == 'add_eff') { //Кастуем эффект @@ -884,16 +885,10 @@ class Dungeon $j = 0; while ($j < count($t)) { $itm = explode('=', $t[$j]); - $ch = $u->testAction( - '`vars` = "add_eff_' . $this->info['id'] . '_' . $obj['id'] . '" AND `uid` = "' . $this->userinfo['id'] . '" LIMIT ' . (1 + (int)$itm[2]) . '', - 2 - ); //кол-во прошлых попыток - $ch = $ch[0]; - $ch2 = $u->testAction( - ' `vars` = "add_eff_' . $this->info['id'] . '_' . $obj['id'] . '" LIMIT ' . (1 + (int)$itm[4]) . '', - 2 - ); //кол-во прошлых попыток (все юзеры) - $ch2 = $ch2[0]; + + $ch = ActionModel::testCount(["uid = {$this->userinfo['id']}", "vars = add_eff_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[2]); //кол-во прошлых попыток + $ch2 = ActionModel::testCount(["vars = add_eff_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[4]); //кол-во прошлых попыток (все юзеры) + if (($ch2 < $itm[4] || $itm[4] == 0) && $ch < $itm[2]) { if ($itm[1] * 100 >= rand(0, 10000)) { //удачно @@ -936,11 +931,8 @@ class Dungeon $t = explode(',', $s[1]); while ($j < count($t)) { $itm = explode('=', $t[$j]); - $ch = $u->testAction( - '`vars` = "bafit_' . $this->info['id'] . '_' . $obj['id'] . '" LIMIT ' . (1 + (int)$itm[2]) . '', - 2 - ); //кол-во прошлых попыток - $ch = $ch[0]; + $ch = ActionModel::testCount(["vars = bafit_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[2]); //кол-во прошлых попыток + if ($ch < $itm[3]) { if ($itm[2] * 1000 >= rand(1, 100000)) { if ($itm[0] == 'hpNow') { @@ -1026,11 +1018,8 @@ class Dungeon $t = explode(',', $s[1]); while ($j < count($t)) { $itm = explode('=', $t[$j]); - $ch = $u->testAction( - '`uid` = "' . $this->userinfo['id'] . '" AND `vars` = "takeit_' . $this->info['id'] . '_' . $obj['id'] . '" LIMIT ' . (1 + (int)$itm[2]) . '', - 2 - ); //кол-во прошлых попыток - $ch = $ch[0]; + $ch = ActionModel::testCount(["uid = {$this->userinfo['id']}", "vars = takeit_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[2]); //кол-во прошлых попыток + if ($ch >= $itm[2]) { //закончились попытки $r = 'ничего не произошло...
'; @@ -1050,9 +1039,8 @@ class Dungeon ); if (isset($it['id'])) { $r .= 'Вы обнаружили предмет "' . $it['name'] . '".
'; - ItemsModel::addItem( - ['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]] - ); + ItemsModel::addItem($it['id'], $this->userinfo['id']); + //ItemsModel::addItem(['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]]); } } else { //неудачная попытка @@ -1067,98 +1055,84 @@ class Dungeon } } elseif ($s[0] == 'itm1') { //Добавляем предмет , только 1 предмет из всех и все юзеры могут тоже - $nj = 0; $t = explode(',', $s[1]); $j = rand(0, count($t)); - if ($nj == 0) { - $itm = explode('=', $t[$j]); - $ch = $u->testAction( - '`uid` = "' . $this->userinfo['id'] . '" AND `vars` = "takeit_' . $this->info['id'] . '_' . $obj['id'] . '" LIMIT ' . (1 + (int)$itm[2]) . '', - 2 - ); //кол-во прошлых попыток - $ch = $ch[0]; - if ($ch >= $itm[2]) { - //закончились попытки - $r .= 'Странно, но ничего не произошло...
'; - } else { - if ($itm[1] * 1000 >= rand(1, 100000)) { + $itm = explode('=', $t[$j]); + $ch = ActionModel::testCount(["uid = {$this->userinfo['id']}", "vars = takeit_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[2]); //кол-во прошлых попыток - //Случайный предмет (Башня смерти) - if ($itm[0] == 'random1') { - $itm[0] = $this->itbs[rand(0, count($this->itbs))]; - } + if ($ch >= $itm[2]) { + //закончились попытки + $r .= 'Странно, но ничего не произошло...
'; + } else { + if ($itm[1] * 1000 >= rand(1, 100000)) { - //удачная попытка - $it = mysql_fetch_assoc( - mysql_query( - 'SELECT * FROM `items_main` WHERE `id`="' . ((int)$itm[0]) . '" LIMIT 1' - ) - ); - if (isset($it['id'])) { - $r .= 'Вы обнаружили предмет "' . $it['name'] . '".
'; - $u->addAction( - time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city'] - ); - ItemsModel::addItem( - ['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]] - ); - $nj++; - } - } else { - //неудачная попытка + //Случайный предмет (Башня смерти) + if ($itm[0] == 'random1') { + $itm[0] = $this->itbs[rand(0, count($this->itbs))]; + } + + //удачная попытка + $it = mysql_fetch_assoc( + mysql_query( + 'SELECT * FROM `items_main` WHERE `id`="' . ((int)$itm[0]) . '" LIMIT 1' + ) + ); + if (isset($it['id'])) { + $r .= 'Вы обнаружили предмет "' . $it['name'] . '".
'; $u->addAction( time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city'] ); - $r .= 'Вы ничего не нашли ...
'; + ItemsModel::addItem($it['id'], $this->userinfo['id']); + //ItemsModel::addItem(['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]]); } + } else { + //неудачная попытка + $u->addAction( + time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city'] + ); + $r .= 'Вы ничего не нашли ...
'; } } + } elseif ($s[0] == 'itm2') { //Добавляем предмет , только 1 предмет из всех и только 1 юзер может поднять - $nj = 0; + $t = explode(',', $s[1]); $j = rand(0, count($t) - 1); - if ($nj == 0) { - $itm = explode('=', $t[$j]); - $ch = $u->testAction( - '`vars` = "takeit_' . $this->info['id'] . '_' . $obj['id'] . '" LIMIT ' . (1 + (int)$itm[2]) . '', - 2 - ); //кол-во прошлых попыток - $ch = $ch[0]; - if ($ch >= $itm[2]) { - //закончились попытки - $r .= 'Ничего не произошло...
'; - } else { - if ($itm[1] * 1000 >= rand(1, 100000)) { + $itm = explode('=', $t[$j]); + $ch = ActionModel::testCount(["vars = takeit_{$this->info['id']}_{$obj['id']}"], 1 + (int)$itm[2]); //кол-во прошлых попыток - //Случайный предмет (Башня смерти) - if ($itm[0] == 'random1') { - $itm[0] = $this->itbs[rand(0, count($this->itbs))]; - } + if ($ch >= $itm[2]) { + //закончились попытки + $r .= 'Ничего не произошло...
'; + } else { + if ($itm[1] * 1000 >= rand(1, 100000)) { - //удачная попытка - $it = mysql_fetch_assoc( - mysql_query( - 'SELECT * FROM `items_main` WHERE `id`="' . ((int)$itm[0]) . '" LIMIT 1' - ) - ); - if (isset($it['id'])) { - $r .= 'Вы обнаружили предмет "' . $it['name'] . '".
'; - $u->addAction( - time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city'] - ); - ItemsModel::addItem( - ['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]] - ); - $nj++; - } - } else { - //неудачная попытка + //Случайный предмет (Башня смерти) + if ($itm[0] == 'random1') { + $itm[0] = $this->itbs[rand(0, count($this->itbs))]; + } + + //удачная попытка + $it = mysql_fetch_assoc( + mysql_query( + 'SELECT * FROM `items_main` WHERE `id`="' . ((int)$itm[0]) . '" LIMIT 1' + ) + ); + if (isset($it['id'])) { + $r .= 'Вы обнаружили предмет "' . $it['name'] . '".
'; $u->addAction( time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city'] ); - $r .= 'Вы ничего не нашли ...
'; + ItemsModel::addItem($it['id'], $this->userinfo['id']); + //ItemsModel::addItem(['uid' => $this->userinfo['id'], 'iid' => $it['id'], 'x' => $this->userinfo['x'], 'y' => $this->userinfo['y'], 'del' => (int)$itm[4]]); } + } else { + //неудачная попытка + $u->addAction( + time(), 'takeit_' . $this->info['id'] . '_' . $obj['id'], $this->userinfo['city'] + ); + $r .= 'Вы ничего не нашли ...
'; } } } elseif ($s[0] == 'fileact') { @@ -1166,7 +1140,7 @@ class Dungeon } $i++; } - $r = rtrim($r, '\'); + $r = rtrim($r, '\
'); if ($r == '') { $r = 'В этот раз не удалось найти что-либо еще'; } @@ -1690,7 +1664,7 @@ class Dungeon } - $sp = mysql_query('SELECT * FROM `dungeon_now` WHERE `time_finish` = "0" LIMIT 50'); + $sp = mysql_query('select * from dungeon_now where time_finish = 0 limit 50'); while ($pl = mysql_fetch_assoc($sp)) { $cn = mysql_fetch_assoc( mysql_query('SELECT `id` FROM `stats` WHERE `dnow` = "' . $pl['id'] . '" LIMIT 1') diff --git a/_incl_data/class/Helper/QueryBuilder.php b/_incl_data/class/Helper/QueryBuilder.php new file mode 100644 index 00000000..a27facd2 --- /dev/null +++ b/_incl_data/class/Helper/QueryBuilder.php @@ -0,0 +1,68 @@ +columns = $columns; + } + + /** + * @throws Exception + */ + public function select(array $filters = [], int $limit = 0): array + { + if (empty($filters)) { + return ['sql' => "select $this->columns from $this->tableName"]; + } + $where = []; + $params = []; + foreach ($filters as $filter) { + [$name, $operation, $value] = explode(' ', $filter, 3); + $placeholder = ":$name"; + $value = explode(' ', $value, 3); //todo: а ведь может прилететь значение из нескольких слов с пробелом... + if (count($value) === 1) { + $value = $value[0]; + if (is_numeric($value)) { + $value = (int)$value; + } + } else { + array_walk_recursive($value, function (&$var) { + if (is_numeric($var)) { + $var = (int)$var; + } + }); + if (is_numeric($value[0]) && is_numeric($value[2])) { + $value = match ($value[1]) { + '+' => $value[0] + $value[2], + '-' => $value[0] - $value[2], + '*' => $value[0] * $value[2], + '/' => ($value[2] != 0) ? $value[0] / $value[2] : throw new Exception('Деление на ноль недопустимо.'), + default => throw new Exception('Недопустимый оператор. Допустимы: +, -, *, /.'), + }; + } elseif (is_string($value[0])) { + $placeholder = "$value[0] $value[1] :$name"; + $value = $value[2]; + } elseif (is_string($value[2])) { + $placeholder = "$value[2] $value[1] :$name"; + $value = $value[0]; + } + } + //todo: но есть ещё форменное скотство, когда в запрос кидают сложные формулы... + + $where[] = "$name $operation $placeholder"; + $params[$name] = $value; + } + + return [ + 'sql' => "select $this->columns from $this->tableName where " . implode(" and ", $where) . ($limit > 0 ? " limit $limit" : ""), + 'binds' => $params, + ]; + } +} \ No newline at end of file diff --git a/_incl_data/class/Magic.php b/_incl_data/class/Magic.php index ec88e856..dce02ff9 100644 --- a/_incl_data/class/Magic.php +++ b/_incl_data/class/Magic.php @@ -1491,9 +1491,6 @@ class Magic } else { $u->error = 'Персонаж "' . $jl . '" не найден в этом городе (' . $u->info['city'] . ')'; } - } elseif (isset($st['useOnItem']) && $st['useOnItem'] == 1) { - //используем на предмет - } else { //на себя $goodUse = 1; @@ -1502,170 +1499,7 @@ class Magic $u->error = 'Хаосники не могут использовать данное заклятие'; } - if ($itm['magic_inci'] == 'sanich2') { - if ($u->info['battle'] == 0) { - $sz = $u->testAction( - '`uid` = "' . $u->info['id'] . '" AND `vars` = "sanich2" AND `time` > ' . (time() - 4 * 60 * 60) . ' LIMIT 1', 1 - ); - if (!isset($sz['id'])) { - $slech = rand(0, 4); - $goodUse = 0; - if ($slech == 1) { - //3083 Настойка на жучьей требухе - //$this->add_eff($u->info['id'],3083); - mysql_query( - 'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 290 AND `delete` =0' - ); - $this->addEffect($u->info['id'], 290); - $echotext = 'Настойка на жучьей требухе!'; - $u->error = 'Вы получили эфект от ' . $echotext . ''; - } elseif ($slech == 2) { - //5239 Амброзия подмастерья Владык - //$this->add_eff($u->info['id'],5239); - mysql_query( - 'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 472 AND `delete` =0' - ); - mysql_query( - 'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 470 AND `delete` =0' - ); - $this->addEffect($u->info['id'], 472); - $echotext = 'Амброзия подмастерья Владык!'; - $u->error = 'Вы получили эфект от ' . $echotext . ''; - } elseif ($slech == 3) { - //5069 Амброзия Скучающих Владык - //$this->add_eff($u->info['id'],470); - mysql_query( - 'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 472 AND `delete` =0' - ); - mysql_query( - 'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 470 AND `delete` =0' - ); - $this->addEffect($u->info['id'], 470); - $echotext = 'Амброзия Скучающих Владык!'; - $u->error = 'Вы получили эфект от ' . $echotext . ''; - } elseif ($slech == 4) { - //1463 Звездное Сияние - //$this->add_eff($u->info['id'],1463); - mysql_query( - 'DELETE FROM `eff_users` WHERE `uid` = "' . $u->info['id'] . '" AND `id_eff` = 35 AND `delete` =0' - ); - $this->addEffect($u->info['id'], 35); - $echotext = 'Звездное Сияние!'; - $u->error = 'Вы получили эфект от ' . $echotext . ''; - } else { - $slech = 1; - - $echotext = 'Не удалось прочитать страницу!'; - $u->error = ' ' . $echotext . ' '; - } - - $itm['iznosNOW'] += $slech; - mysql_query( - 'UPDATE `items_users` SET `iznosNOW` = "' . $itm['iznosNOW'] . '" WHERE `id` = "' . $itm['id'] . '" AND `uid` = "' . $u->info['id'] . '" LIMIT 1' - ); - $u->addAction(time(), 'sanich2', $slech); - - if ($u->info['sex'] == 1) { - $rtxt = '[img[items/' . $itm['img'] . ']] "' . $u->info['login'] . '" использовала "' . $itm['name'] . ' Саныча" и получила эффект ' . $echotext . ' травмы.'; - } else { - $rtxt = '[img[items/' . $itm['img'] . ']] "' . $u->info['login'] . '" использовал "' . $itm['name'] . ' Саныча" и получил эффект ' . $echotext . ' травмы.'; - } - - } else { - $u->error = 'Задержка использования ' . Conversion::secondsToTimeout( - ($sz['time'] + 4 * 60 * 60) - time() - ) . '.'; - } - } else { - $u->error = 'Невозможно использовать в бою'; - } - - } elseif ($itm['magic_inci'] == 'sanich1' && $u->info['battle'] > 0) { - - $sz = $u->testAction( - '`uid` = "' . $u->info['id'] . '" AND `vars` = "sanich1" AND `time` > ' . (time() - 6 * 60) . ' LIMIT 1', 1 - ); - if (!isset($sz['id'])) { - $goodUse = 0; - $u->error = 'Вы успешно использовали "' . $itm['name'] . '"'; - $z = 1; - while ($z <= 5) { - $u->info['tactic' . $z]++; - if ($u->info['tactic' . $z] > 25) { - $u->info['tactic' . $z] = 25; - } elseif ($u->info['tactic' . $z] < 0) { - $u->info['tactic' . $z] = 0; - } - $z++; - } - if ($u->info['sex'] == 1) { - $this->inBattleLog('{u1} использовала "' . $itm['name'] . ' Саныча".'); - } else { - $this->inBattleLog('{u1} использовал "' . $itm['name'] . ' Саныча".'); - } - mysql_query( - 'UPDATE `stats` SET `tactic1` = "' . $u->info['tactic1'] . '",`tactic2` = "' . $u->info['tactic2'] . '",`tactic3` = "' . $u->info['tactic3'] . '",`tactic4` = "' . $u->info['tactic4'] . '",`tactic5` = "' . $u->info['tactic5'] . '" WHERE `id` = "' . $u->info['id'] . '" LIMIT 1' - ); - $itm['iznosNOW']++; - mysql_query( - 'UPDATE `items_users` SET `iznosNOW` = "' . $itm['iznosNOW'] . '" WHERE `id` = "' . $itm['id'] . '" AND `uid` = "' . $u->info['id'] . '" LIMIT 1' - ); - $u->addAction(time(), 'sanich1', $u->info['battle']); - } else { - $u->error = 'Задержка использования ' . Conversion::secondsToTimeout(($sz['time'] + 6 * 60) - time()) . '.'; - } - - } elseif ($itm['magic_inci'] == 'sanich3' && $u->info['battle'] > 0) { - - $sz = $u->testAction( - '`uid` = "' . $u->info['id'] . '" AND `vars` = "sanich3" AND `time` > ' . (time() - 3 * 60 * 60) . ' LIMIT 1', 1 - ); - if (!isset($sz['id'])) { - - $usr = mysql_fetch_array( - mysql_query( - 'SELECT `u`.`id`,`u`.`level`,`s`.`hpNow`,`s`.`team`,`u`.`login`,`u`.`sex` FROM `users` AS `u` LEFT JOIN `stats` AS `s` ON `s`.`id` = `u`.`id` WHERE `u`.`id` = "' . $u->info['enemy'] . '" AND `u`.`battle` = "' . $u->info['battle'] . '" LIMIT 1' - ) - ); - if (isset($usr['id']) && $usr['hpNow'] >= 1) { - $iznslvl = $usr['level']; - - $goodUse = 0; - $u->error = 'Вы успешно использовали "' . $itm['name'] . '" на ' . $usr['login'] . ''; - - if ($u->info['sex'] == 1) { - $this->inBattleLog( - '{u1} использовала "' . $itm['name'] . ' Саныча" на {u2}.', - $usr - ); - } else { - $this->inBattleLog( - '{u1} использовал "' . $itm['name'] . ' Саныча" на {u2}.', $usr - ); - } - - mysql_query( - 'UPDATE `stats` SET `hpNow` = "' . $usr['hpNow'] . '" WHERE `id` = "' . $u->info['id'] . '" LIMIT 1' - ); - mysql_query( - 'UPDATE `stats` SET `hpNow` = "' . $u->stats['hpNow'] . '" WHERE `id` = "' . $usr['id'] . '" LIMIT 1' - ); - $itm['iznosNOW'] += $iznslvl; - mysql_query( - 'UPDATE `items_users` SET `iznosNOW` = "' . $itm['iznosNOW'] . '" WHERE `id` = "' . $itm['id'] . '" AND `uid` = "' . $u->info['id'] . '" LIMIT 1' - ); - $u->addAction(time(), 'sanich3', $u->info['battle']); - } else { - $u->error = 'Нет подходящего противника'; - } - - } else { - $u->error = 'Задержка использования ' . Conversion::secondsToTimeout( - ($sz['time'] + 3 * 60 * 60) - time() - ) . '.'; - } - - } elseif ($itm['magic_inci'] == 'lech') { + if ($itm['magic_inci'] == 'lech') { $goodUse = 0; if ($u->info['level'] >= 2 and $u->info['level'] <= 13) { $travm = mysql_fetch_array( @@ -1698,7 +1532,6 @@ class Magic if ($goodUse == 1) { - $upd1 = 1; $upd2 = 1; //добавляем эффект персонажу diff --git a/_incl_data/class/Magic/podvig.php b/_incl_data/class/Magic/podvig.php index 00e1eb30..9b69f509 100644 --- a/_incl_data/class/Magic/podvig.php +++ b/_incl_data/class/Magic/podvig.php @@ -1,38 +1,39 @@ info['id'] . '" AND `vars` = "podvig" AND `time` > "' . (time()) . '" LIMIT 1')); - if ($u->info['align'] != 2) { - if (isset($test['id'])) { - $u->error = 'Задержка не прошла, еще ' . Conversion::secondsToTimeout($test['time'] - time()); - } else { - // - $dngcity = [ - 5035 => ['angelscity', 'Бездна'], - 5036 => ['capitalcity', 'Пещера Тысячи Проклятий'], - 5037 => ['demonscity', 'Катакомбы'], - 5038 => ['abandonedplain', 'Гора Легиона'], //mooncity - 5039 => ['suncity', 'Грибница'], - 5040 => ['sandcity', 'Пещера Мглы'], - ]; - $dngcity = $dngcity[$itm['item_id']]; - $hgo1 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > "' . (time() - 86400) . '" AND `vars` = "psh_qt_' . $dngcity[0] . '" LIMIT 1', 1); - if (!isset($hgo1['id'])) { - $u->error = 'Нет задержки для подземелья ' . $dngcity[1] . '.'; - } else { - $u->addAction(time(), 'podvig', ''); - $u->error = 'Успешно использован свиток Право на Подвиг (' . $dngcity[1] . ')'; - mysql_query('UPDATE `actions` SET `time` = "' . (time() - 86401) . '" WHERE `id` = "' . ($hgo1['id']) . '" LIMIT 1'); - mysql_query('UPDATE `items_users` SET `iznosNOW` = `iznosNOW` + 1 WHERE `id` = "' . $itm['id'] . '" LIMIT 1'); - } - } + $test = Db::getRow("select id, time from actions where uid = ? and vars = 'podvig' and time > unix_timestamp() limit 1", [$u->info['id']]); + if (isset($test['id'])) { + $u->error = 'Задержка не прошла, еще ' . Conversion::secondsToTimeout($test['time'] - time()); } else { - $u->error = 'Хаосники не могут пользоваться этим свитком!'; + // + $dngcity = [ + 5035 => ['angelscity', 'Бездна'], + 5036 => ['capitalcity', 'Пещера Тысячи Проклятий'], + 5037 => ['demonscity', 'Катакомбы'], + 5038 => ['abandonedplain', 'Гора Легиона'], //mooncity + 5039 => ['suncity', 'Грибница'], + 5040 => ['sandcity', 'Пещера Мглы'], + ]; + $dngcity = $dngcity[$itm['item_id']]; + $hgo1 = ActionModel::getOne(["uid = {$u->info['id']}", "time > unix_timestamp() - 86400", "vars = psh_qt_$dngcity[0]"], 'id'); + + if (!isset($hgo1)) { + $u->error = 'Нет задержки для подземелья ' . $dngcity[1] . '.'; + } else { + $u->addAction(time(), 'podvig', ''); + $u->error = "Успешно использован свиток Право на Подвиг ($dngcity[1])"; + Db::sql('update actions set time = unix_timestamp() - 86401 where id = ?', [$hgo1]); + ItemsModel::addIznos($itm['id']); + } } + } diff --git a/_incl_data/class/Magic/tznanie.php b/_incl_data/class/Magic/tznanie.php index b4f7a607..e08beb0c 100644 --- a/_incl_data/class/Magic/tznanie.php +++ b/_incl_data/class/Magic/tznanie.php @@ -1,4 +1,8 @@ error = 'Так не пойдет, вы уже что-то изучаете'; } else { - $tst = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `vars` = "read" AND `vals` = "' . $itm['item_id'] . '" LIMIT 1', 1); - if (isset($tst['id'])) { + $tst = (bool)ActionModel::testCount(["uid = $u->info['id']", 'vars = read', "vals = {$itm['item_id']}"]); + + if ($tst) { $u->error = 'Вы уже изучили данное знание'; } else { $fn = ''; $tom_iz = 0; if (($itm['item_id'] >= 1045 && $itm['item_id'] <= 1047) || ($itm['item_id'] >= 4812 && $itm['item_id'] <= 4813)) { - $tst2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `vars` = "read" AND `vals` = "' . ($itm['item_id'] - 1) . '" LIMIT 1', 1); - if (!isset($tst2['id'])) { + $tst2 = (bool)ActionModel::testCount(["uid = $u->info['id']", 'vars = read', "vals = {$itm['item_id']} - 1"]); + if (!$tst2) { $tom_iz = 1; } unset($tst2); @@ -41,7 +46,7 @@ if (isset($po['finish_file']) && $po['finish_file'] == 'tznanie') { $u->error = 'Вы изучили "' . $itm['name'] . '".'; $u->addAction(time() + $st['timeRead'], 'read', $itm['item_id']); - mysql_query('UPDATE `items_users` SET `iznosNOW` = `iznosNOW` + 1 WHERE `id` = ' . $itm['id'] . ' LIMIT 1'); + ItemsModel::addIznos($itm['id']); } else { $u->error = 'Требует изучения предыдущего тома'; diff --git a/_incl_data/class/Model/ActionModel.php b/_incl_data/class/Model/ActionModel.php index e84a8fbc..704b53a6 100644 --- a/_incl_data/class/Model/ActionModel.php +++ b/_incl_data/class/Model/ActionModel.php @@ -3,10 +3,13 @@ namespace Model; use Core\Db; +use Exception; +use Helper\QueryBuilder; use User\UserIp; class ActionModel { + private const TABLE_NAME = 'actions'; private int $uid; public function __construct(int $uid) @@ -34,9 +37,51 @@ class ActionModel ); } - public static function getAll(string $filter = ''): array + public static function get(array $filters, string $columns = '*'): array { - return Db::getRows('select * from actions'); + $query = new QueryBuilder(self::TABLE_NAME, $columns); + try { + $stmt = $query->select($filters, 1); + return Db::getRow($stmt['sql'], $stmt['binds']); + } catch (Exception $e) { + echo $e->getMessage(); + trigger_error(__METHOD__ . ': ' . $e->getMessage(), E_USER_ERROR); + } + } + + public static function getOne(array $filters, string $column): mixed + { + $result = self::get($filters, $column); + if (!empty($result)) { + return array_shift($result); + } + return ''; + } + + public static function deleteById(int $id): void + { + Db::sql('delete from actions where id = ?', [$id]); + } + + public static function testCount(array $filters, int $limit = 0): int + { + $query = new QueryBuilder(self::TABLE_NAME, 'count(id)'); + try { + $stmt = $query->select($filters, $limit); + return Db::getValue($stmt['sql'], $stmt['binds']); + } catch (Exception $e) { + echo $e->getMessage(); + trigger_error(__METHOD__ . ': ' . $e->getMessage(), E_USER_ERROR); + } + } + + public static function testCountCustom(string $filter, array $binds, int $limit = 0): int + { + $sql = "select count(id) from actions where $filter"; + if ($limit > 0) { + $sql .= ' limit ' . $limit; + } + return (int)Db::getValue($sql, $binds); } public function getByVals(string $vals) @@ -54,6 +99,11 @@ class ActionModel public function getLastByValsAndTime(string $vals, int $time) { + $filter = [ + "uid = $this->uid", + "vals = '$vals'", + "time > unix_timestamp() - $time", + ]; return Db::getRow( 'select * from actions where uid = ? and vals = ? and time > unix_timestamp() - ? order by time desc limit 1', [$this->uid, $vals, $time] @@ -65,28 +115,14 @@ class ActionModel Db::sql('delete from actions where uid = ? and vals = ?', [$this->uid, $vals]); } - public static function deleteById(int $id): void + public function getDailyQuest(): array { - Db::sql('delete from actions where id = ?', [$id]); - } + $filter = [ + "uid = $this->uid", + "vars = 'day_quest'", + ]; - /*protected function testAction($filter, $tp): array - { - if ($tp == 1) { - $query = 'select * from actions where ' . $filter; - } elseif ($tp == 2) { - $query = 'select count(*) from actions where ' . $filter; - } else { - return []; - } - $arr = mysql_fetch_array(mysql_query($query)); - - return !empty($arr) ? $arr : []; - }*/ - - public function getDailyQuest(): array|false - { - return Db::getRow("select * from actions where uid = ? and vars = 'day_quest' limit 1", [$this->uid]); + return self::get($filter); } public function getFinishedDailyQuestTasks(int $timeout): array diff --git a/_incl_data/class/Priems.php b/_incl_data/class/Priems.php index 700d7230..6d4b1a2d 100644 --- a/_incl_data/class/Priems.php +++ b/_incl_data/class/Priems.php @@ -5,6 +5,7 @@ use Core\Db; use DarksLight2\Training\TrainingManager; use Helper\Conversion; use Helper\Math; +use Model\ActionModel; use Model\Constant\Stat; use User\Effects; @@ -108,7 +109,7 @@ class Priems /** используем прием каждый ход * @param Battle $btl - * @param array $eff + * @param array $eff * @return bool */ public function hodUsePriem(Battle $btl, array $eff): bool @@ -466,11 +467,11 @@ class Priems /** * Новая функция магического заклинания с приёма. * Работает с числовыми приёмами в папке [priem]. - * @param int $attackerId кто использует приём - * @param int $defenderId на кого использует приём - * @param float $damage базовый урон приёма - * @param string $damageType тип урона (стихия?) приходит строкой, и конвертируется функцией. - * @param bool $hasCritical флаг, что приём МОЖЕТ критовать + * @param int $attackerId кто использует приём + * @param int $defenderId на кого использует приём + * @param float $damage базовый урон приёма + * @param string $damageType тип урона (стихия?) приходит строкой, и конвертируется функцией. + * @param bool $hasCritical флаг, что приём МОЖЕТ критовать * @return array [0|damage] int урон, [1|crit] bool был ли крит, [2|miss] bool был ли промах, [3|miss_type] int тип промаха (всегда = 2). * @author Insallah */ @@ -786,7 +787,8 @@ class Priems $krituet = true, $heal = 0, $namenew = null - ) { + ) + { $trawm_off = false; global $btl; if ($namenew != null) { @@ -965,8 +967,7 @@ class Priems ); //заносим в лог боя - $vLog = 'time1=' . time( - ) . '||s1=' . $btl->users[$btl->uids[$usu]]['sex'] . '||t1=' . $btl->users[$btl->uids[$usu]]['team'] . '||login1=' . $btl->users[$btl->uids[$usu]]['login'] . '||s2=' . $btl->users[$btl->uids[$uen]]['sex'] . '||t2=' . $btl->users[$btl->uids[$uen]]['team'] . '||login2=' . $btl->users[$btl->uids[$uen]]['login'] . ''; + $vLog = 'time1=' . time() . '||s1=' . $btl->users[$btl->uids[$usu]]['sex'] . '||t1=' . $btl->users[$btl->uids[$usu]]['team'] . '||login1=' . $btl->users[$btl->uids[$usu]]['login'] . '||s2=' . $btl->users[$btl->uids[$uen]]['sex'] . '||t2=' . $btl->users[$btl->uids[$uen]]['team'] . '||login2=' . $btl->users[$btl->uids[$uen]]['login'] . ''; $mas1 = [ 'time' => time(), 'battle' => $btl->i->id, @@ -1088,276 +1089,245 @@ class Priems return $rr; } - public function pruse($id) + public function pruse($id): void { global $btl; - $u = $this->u; // Для присоедиянемых файлов. if ($id == 100500 && $this->u->info['animal'] > 0) { - $use_lst = $this->u->testAction( - '`uid` = "' . $this->u->info['id'] . '" AND `vars` = "animal_use' . $btl->i->id . '" LIMIT 1', - 1 - ); - if (!isset($use_lst['id'])) { - $a = mysql_fetch_assoc( - mysql_query( - 'SELECT * FROM `users_animal` WHERE `uid` = "' . $this->u->info['id'] . '" AND `id` = "' . $this->u->info['animal'] . '" AND `pet_in_cage` = "0" AND `delete` = "0" LIMIT 1' - ) - ); - if ($this->u->stats['hpNow'] < 1) { - echo 'Вы не можете выпустить зверя, вы потеряли все НР'; - } elseif (isset($a['id']) && $a['eda'] < 1) { - echo 'Вы не накормили зверя...'; - } elseif (isset($a['id'])) { - //Добавляем зверя в бой - $tp = [ - 1 => 'Кот', - 2 => 'Сова', - 3 => 'Светляк', - 4 => 'Чертяка', - 5 => 'Пес', - 6 => 'Свин', - 7 => 'Дракон', - ]; - $id = mysql_fetch_assoc( - mysql_query( - 'SELECT `id` FROM `test_bot` WHERE `login` = "' . $tp[$a['type']] . ' [' . $a['level'] . ']" LIMIT 1' - ) - ); - if (isset($id['id']) && $btl->i->type != 500) { - $b = $this->u->addNewbot($id['id'], null, null); - if ($b > 0 && $b) { - $a['eda'] -= 4; - if ($a['eda'] < 0) { - $a['eda'] = 0; - } - - $vLog = 'time1=' . time() . '||s1=' . $this->u->info['sex'] . '||t1=' . $this->u->info['team'] . '||login1=' . $this->u->info['login'] . ''; - $mas1 = [ - 'time' => time(), - 'battle' => $btl->i->id, - 'id_hod' => $btl->hodID, - 'vars' => $vLog, - 'zona1' => '', - 'zonb1' => '', - 'zona2' => '', - 'zonb2' => '', - 'type' => '1', - ]; - - $sex = $this->u->info['sex'] === 1 ? 'a' : ''; - $mas1['text'] = "{tm1} {u1} выпустил$sex зверя "" . $a['name'] . '"'; - Log::add($mas1); - - mysql_query( - 'UPDATE `users` SET `login` = "' . $a['name'] . ' (зверь ' . $this->u->info['login'] . ')",`obraz` = "' . $a['obraz'] . '.gif",`battle` = "' . $btl->i->id . '" WHERE `id` = "' . $b['id'] . '" LIMIT 1' - ); - mysql_query( - 'UPDATE `stats` SET `team` = "' . $this->u->info['team'] . '" WHERE `id` = "' . $b['id'] . '" LIMIT 1' - ); - mysql_query( - 'UPDATE `users_animal` SET `eda` = "' . $a['eda'] . '" WHERE `id` = "' . $a['id'] . '" LIMIT 1' - ); - $this->u->addAction(time(), 'animal_use' . $btl->i->id, $a['level']); - } else { - echo 'Не удалось выпустить зверя...'; - } - } else { - //Бот не найден - echo '
Не удалось выпустить зверя - он боится...'; - } - } else { - //зверь не найден - echo 'У Вас нет зверя ...'; - } - } else { - //зверь уже выпущен - echo 'Вы уже выпускали зверя в этом бою ...'; - } + $this->processAnimal($btl); } else { - $p = explode('|', $this->u->info['priems']); - $pz = explode('|', $this->u->info['priems_z']); - if ($p[(int)$id] > 0 && $pz[(int)$id] <= 0 && $this->u->info['hpNow'] >= 1) { - $pl = mysql_fetch_assoc( - mysql_query( - 'SELECT * FROM `priems` WHERE `level`<=' . $this->u->info['level'] . ' AND `id` = ' . $p[(int)$id] - ) - ); - if (isset($pl['id']) && $pl['activ'] != 1) { - if ($pl['activ'] == 0) { - unset($pl); - } elseif ($pl['activ'] > 1) { - //Книжный прием - if ($this->testActiv($pl['activ']) == 0) { - unset($pl); - } - } - } - if (isset($pl['id'])) { - $notr = 0; - $pl['useon_user'] = $this->u->info['enemy']; - if (isset($_POST['useon']) && $_POST['useon'] != '' && $_POST['useon'] != 'none') { - $this->ue = mysql_fetch_assoc( - mysql_query( - 'SELECT - - `u`.`id`,`u`.`login`,`u`.`login2`,`u`.`online`,`u`.`admin`,`u`.`city`,`u`.`cityreg`,`u`.`align`,`u`.`clan`, - `u`.`level`,`u`.`money`,`u`.`money3`,`u`.`money4`,`u`.`battle`,`u`.`sex`,`u`.`obraz`,`u`.`win`,`u`.`win_t`, - `u`.`lose`,`u`.`lose_t`,`u`.`nich`,`u`.`timeMain`,`u`.`invis`,`u`.`bot_id`,`u`.`animal`,`u`.`type_pers`, - `u`.`notrhod`,`u`.`bot_room`,`u`.`inUser`,`u`.`inTurnir`,`u`.`inTurnirnew`,`u`.`stopexp`,`u`.`real`, - - `st`.* - - FROM `users` AS `u` - LEFT JOIN `stats` AS `st` ON (`u`.`id`=`st`.`id`) - WHERE ( - `u`.`login`="' . mysql_real_escape_string($_POST['useon']) . '" OR - ( - `u`.`login2` = "' . mysql_real_escape_string($_POST['useon']) . '" AND - `u`.`login2` != "") - ) AND - ( - `u`.`inUser` > 0 OR - ( - `u`.`battle`="' . $btl->i->id . '" AND - `st`.`hpNow` > 0 - ) - ) ORDER BY `u`.`id` DESC LIMIT 1' - ) - ); - if (isset($this->ue['id']) && $this->ue['inUser'] > 0) { - $this->ue = mysql_fetch_assoc( - mysql_query( - 'SELECT - - `u`.`id`,`u`.`login`,`u`.`login2`,`u`.`online`,`u`.`admin`,`u`.`city`,`u`.`cityreg`,`u`.`align`,`u`.`clan`, - `u`.`level`,`u`.`money`,`u`.`money3`,`u`.`money4`,`u`.`battle`,`u`.`sex`,`u`.`obraz`,`u`.`win`,`u`.`win_t`, - `u`.`lose`,`u`.`lose_t`,`u`.`nich`,`u`.`timeMain`,`u`.`invis`,`u`.`bot_id`,`u`.`animal`,`u`.`type_pers`, - `u`.`notrhod`,`u`.`bot_room`,`u`.`inUser`,`u`.`inTurnir`,`u`.`inTurnirnew`,`u`.`stopexp`,`u`.`real`, - - `st`.* - - FROM `users` AS `u` - LEFT JOIN `stats` AS `st` ON (`u`.`id`=`st`.`id`) - WHERE - `u`.`battle`="' . $btl->i->id . '" AND - `st`.`hpNow` > 0) AND - `u`.`id` = "' . $this->ue['inUser'] . '" ORDER BY `u`.`id` ASC LIMIT 1' - ) - ); - } - if (!isset($this->ue['id']) && $pl['trUser'] > 0) { - $notr++; - } - if ($pl['team'] == 1) { - //свои - if ($this->u->info['team'] != $this->ue['team']) { - $notr++; - } - } elseif ($pl['team'] == 2) { - //противники - if ($this->u->info['team'] == $this->ue['team']) { - $notr++; - } - } - } else { - $ga = mysql_fetch_assoc( - mysql_query( - 'SELECT * FROM `battle_act` WHERE `battle` = "' . $btl->i->id . '" AND `uid1` = "' . $this->u->info['id'] . '" AND `uid2` = "' . $this->u->info['enemy'] . '" LIMIT 1' - ) - ); - if (($this->u->info['enemy'] == 0 || isset($ga['id'])) && ($pl['tr_hod'] > 0 || $pl['trUser'] > 0)) { - $notr++; - } - } - - $notr += $this->testpriem($pl, 1, $this->ue['id']); - - if ($this->ue['id'] > 0) { - $notr += $this->testRazmenOldUser($this->ue['id'], $this->u->info['enemy'], $pl['id']); - } - - if ($notr == 0) { - mysql_query( - 'UPDATE `stats` SET `last_pr` = "' . $pl['id'] . '" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1' - ); - - //Приемы на персонажах - if ($this->ue['id'] > 0) { - $btl->priemsRazmen([$this->u->info['id'], $this->ue['id']], 'fast'); - mysql_query( - 'UPDATE `eff_users` SET `mark` = 1 WHERE `uid` = "' . $this->ue['id'] . '" AND `delete` = 0' - ); - } else { - $btl->priemsRazmen([$this->u->info['id'], $this->u->info['enemy']], 'fast'); - mysql_query( - 'UPDATE `eff_users` SET `mark` = 1 WHERE `uid` = "' . $this->u->info['enemy'] . '" AND `delete` = 0' - ); - } - mysql_query( - 'UPDATE `eff_users` SET `mark` = 1 WHERE `uid` = "' . $this->u->info['id'] . '" AND `delete` = 0' - ); - - if (file_exists('../../_incl_data/class/Priem/' . $pl['id'] . '.php')) { - require('../../_incl_data/class/Priem/' . $pl['id'] . '.php'); - $this->testDie($this->ue['id']); - } else { - echo 'useSkill' . $pl['id']; - } - - if (!isset($cup)) { - $this->uppz($pl, $id); - //Отнимаем тактики - //$this->mintr($pl); - if ($pl['tr_hod'] > 0) { - $this->trhod($pl); - } - if ($pl['id'] != 258) { - if ($pl['cancel_eff'] == '') { - $pl['cancel_eff'] = '258'; - } else { - $pl['cancel_eff'] .= ',258'; - } - } - if ($pl['cancel_eff'] != '') { - $i = 0; - $e = explode(',', $pl['cancel_eff']); - while ($i < count($e)) { - if ($e[$i] > 0) { - if ($e[$i] == 258) { - $nem = mysql_fetch_assoc( - mysql_query( - 'SELECT * FROM `eff_users` WHERE `uid` = "' . $this->u->info['id'] . '" AND `v1` = "priem" AND `v2` = "' . $e[$i] . '" AND `delete` = "0" AND `mark` = 1 LIMIT 1' - ) - ); - } else { - $nem = mysql_fetch_assoc( - mysql_query( - 'SELECT * FROM `eff_users` WHERE `uid` = "' . $this->ue['id'] . '" AND `v1` = "priem" AND `v2` = "' . $e[$i] . '" AND `delete` = "0" AND `mark` = 1 LIMIT 1' - ) - ); - } - if (isset($nem['id'])) { - $nem['priem'] = mysql_fetch_assoc( - mysql_query( - 'SELECT * FROM `priems` WHERE `id` = "' . $e[$i] . '" LIMIT 1' - ) - ); - if (isset($nem['id'])) { - $btl->delPriem($nem, $btl->users[$btl->uids[$this->ue['id']]], 500); - } - } - } - $i++; - } - } - } - } - } - } + $this->processPriem($id, $btl); } } - //для папки priems + private function processAnimal(Battle $btl): void + { + if ($this->u->stats['hpNow'] < 1) { + echo 'Вы не можете выпустить зверя, вы потеряли все НР'; + return; + } + + $alreadyReleased = ActionModel::testCount(["uid = {$this->u->info['id']}", "vars = animal_use{$btl->i->id}"]); + + if (!empty($alreadyReleased)) { + echo 'Вы уже выпускали зверя в этом бою ...'; + return; + } + + $animal = Db::getRow('select * from users_animal where uid = ? and id = ? and pet_in_cage = 0', [$this->u->info['id'], $this->u->info['animal']]); + + if (!isset($animal['id'])) { + echo 'У вас нет зверя.'; + return; + } + + if ($animal['eda'] < 1) { + echo 'Вы не накормили зверя.'; + return; + } + + $animalTypes = [ + 1 => 'Кот', + 2 => 'Сова', + 3 => 'Светляк', + 4 => 'Чертяка', + 5 => 'Пес', + 6 => 'Свин', + 7 => 'Дракон', + ]; + + $botLogin = $animalTypes[$animal['type']] . ' [' . $animal['level'] . ']'; + $botId = Db::getValue('select id from test_bot where login = ?', [$botLogin]); + + if (!$botId) { + echo 'Системная ошибка: Неизвестный зверь!'; + return; + } + + $b = $this->u->addNewbot($botId); + + if (!$b) { + echo 'Не удалось призвать зверя.'; + return; + } + + if ($b > 0) { + $animal['eda'] -= 4; + if ($animal['eda'] < 0) { + $animal['eda'] = 0; + } + + $logData = [ + 'time' => time(), + 'battle' => $btl->i->id, + 'id_hod' => $btl->hodID, + 'vars' => 'time1=' . time() . '||s1=' . $this->u->info['sex'] . '||t1=' . $this->u->info['team'] . '||login1=' . $this->u->info['login'], + 'zona1' => '', + 'zonb1' => '', + 'zona2' => '', + 'zonb2' => '', + 'type' => '1', + 'text' => '{tm1} {u1} выпустил' . ($this->u->info['sex'] === 1 ? 'a' : '') . " зверя «{$animal['name']}».", + ]; + Log::add($logData); + + Db::sql('update users set login = ?, obraz = ?, battle = ? where id = ?', [$animal['name'], $animal['obraz'] . '.gif', $btl->i->id, $b['id']]); + Db::sql('update stats set team = ? where id = ?', [$this->u->info['team'], $b['id']]); + Db::sql('update users_animal set eda = ? where id = ?', [$animal['eda'], $animal['id']]); + $this->u->addAction(time(), 'animal_use' . $btl->i->id, $animal['level']); + } + } + + private function processPriem(int $id, Battle $btl): void + { + $target = ''; + $targetNotEmpty = false; + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $target = (string)filter_input(INPUT_POST, 'useon'); + $targetNotEmpty = $target && $target !== 'none'; + } + $cup = false; + $priemsOnPlayer = explode('|', $this->u->info['priems']); + $pz = explode('|', $this->u->info['priems_z']); + if ($priemsOnPlayer[$id] <= 0 || $pz[$id] > 0 || $this->u->info['hpNow'] < 1) { + return; + } + + $priem = Db::getRow('select * from priems where level <= ? and id = ?', [$this->u->info['level'], $priemsOnPlayer['id']]); + + if (isset($priem['id']) && $priem['activ'] != 1) { + if ($priem['activ'] == 0) { + unset($priem); + } elseif ($priem['activ'] > 1) { + //Книжный прием + if ($this->testActiv($priem['activ']) == 0) { + unset($priem); + } + } + } + + if (!isset($priem['id'])) { + return; + } + + $notr = 0; + $priem['useon_user'] = $this->u->info['enemy']; + if ($targetNotEmpty) { + $this->ue = Db::getRow('select + users.id, login, login2, online, admin, city, cityreg, align, clan, level, money, money3, money4, battle, sex, obraz, win, win_t, lose, lose_t, nich, + timeMain, invis, bot_id, animal, type_pers, notrhod, bot_room, inUser, inTurnir, inTurnirnew, stopexp, `real`, stats.* + from users inner join stats on users.id = stats.id where (login = ? or login2 = ?) and (inUser > 0 or (battle = ? and hpNow > 0)) + order by users.id desc limit 1', [$target, $target, $btl->i->id]); + + if (isset($this->ue['id']) && $this->ue['inUser'] > 0) { + $this->ue = Db::getRow('select + users.id, login, login2, online, admin, city, cityreg, align, clan, level, money, money3, money4, battle, sex, obraz, win, win_t, lose, lose_t, nich, + timeMain, invis, bot_id, animal, type_pers, notrhod, bot_room, inUser, inTurnir, inTurnirnew, stopexp, `real`, stats.* + from users inner join stats on users.id = stats.id where battle = ? and hpNow > 0 and users.id = ? + order by users.id limit 1', [$btl->i->id, $this->ue['inUser']]); + } + + if (!isset($this->ue['id']) && $priem['trUser'] > 0) { + $notr++; + } + if ($priem['team'] == 1) { + //свои + if ($this->u->info['team'] != $this->ue['team']) { + $notr++; + } + } elseif ($priem['team'] == 2) { + //противники + if ($this->u->info['team'] == $this->ue['team']) { + $notr++; + } + } + } else { + $check = Db::getValue('select count(id) from battle_act where battle = ? and uid1 = ? and uid2 = ?', [$btl->i->id, $this->u->info['id'], $this->u->info['enemy']]) > 0; + + if (($this->u->info['enemy'] == 0 || $check) && ($priem['tr_hod'] > 0 || $priem['trUser'] > 0)) { + $notr++; + } + } + + $notr += $this->testpriem($priem, 1, $this->ue['id']); + + if ($this->ue['id'] > 0) { + $notr += $this->testRazmenOldUser($this->ue['id'], $this->u->info['enemy'], $priem['id']); + } + + if ($notr != 0) { + return; + } + + Db::sql('update stats set last_pr = ? where id = ?', [$priem['id'], $this->u->info['id']]); + + //Приемы на персонажах + $markuids = []; + if ($this->ue['id'] > 0) { + $btl->priemsRazmen([$this->u->info['id'], $this->ue['id']], 'fast'); + $markuids[] = $this->ue['id']; + } else { + $btl->priemsRazmen([$this->u->info['id'], $this->u->info['enemy']], 'fast'); + $markuids[] = $this->u->info['enemy']; + } + $markuids[] = $this->u->info['id']; + + Db::sql('update eff_users set mark = 1 where uid in (?)', [implode(',', $markuids)]); + + if (file_exists('../../_incl_data/class/Priem/' . $priem['id'] . '.php')) { + $u = $this->u; // Для присоедиянемых файлов. + require_once '../../_incl_data/class/Priem/' . $priem['id'] . '.php'; + $this->testDie($this->ue['id']); + } else { + echo 'useSkill' . $priem['id']; + } + + if ($cup) { // Из подключаемых файлов. + return; + } + + $this->uppz($priem, $id); + //Отнимаем тактики + //$this->mintr($pl); + if ($priem['tr_hod'] > 0) { + $this->trhod($priem); + } + + if ($priem['id'] != 258) { + if ($priem['cancel_eff'] == '') { + $priem['cancel_eff'] = '258'; + } else { + $priem['cancel_eff'] .= ',258'; + } + } + + if ($priem['cancel_eff'] == '') { + return; + } + + $i = 0; + $e = explode(',', $priem['cancel_eff']); + while ($i < count($e)) { + if ($e[$i] <= 0) { + $i++; + continue; + } + + if ($e[$i] == 258) { + $uid = $this->u->info['id']; + } else { + $uid = $this->ue['id']; + } + + $nem = Db::getRow('select * from eff_users where uid = ? and v1 = \'priem\' and v2 = ? and mark = 1 limit 1', [$uid, $e[$i]]); + + if (isset($nem['id'])) { + $nem['priem'] = Db::getRow('select * from priems where id = ?', [$e['id']]); + $btl->delPriem($nem, $btl->users[$btl->uids[$this->ue['id']]], 500); + } + + $i++; + } + } private function testActiv($id) { @@ -1368,11 +1338,8 @@ class Priems $this->u->info['id'] > 0) { $r = 1; } else { - $tst = $this->u->testAction( - '`uid` = "' . $this->u->info['id'] . '" AND `time` < ' . time() . ' AND `vars` = "read" AND `vals` = "' . $id . '" LIMIT 1', - 1 - ); - if (isset($tst['id'])) { + $test = (bool)Db::getValue("select count(id) from actions where uid = ? and time < unix_timestamp() and vars = 'read' and vals = ?", [$this->u->info['id'], $id]); + if ($test) { $r = 1; } } @@ -1428,11 +1395,8 @@ class Priems if ($pl['xuse'] > 0) { - $xu = $this->u->testAction( - '`vars` = "use_priem_' . $btl->i->id . '_' . $this->u->info['id'] . '" AND `vals` = "' . $pl['id'] . '" LIMIT ' . $pl['xuse'], - 2 - ); - if ($xu[0] >= $pl['xuse']) { + $xu = ActionModel::testCount(["vars = use_priem_{$btl->i->id}_{$this->u->info['id']}", "vals = {$pl['id']}"], $pl['xuse']); + if ($xu >= $pl['xuse']) { $notr++; } } @@ -1579,13 +1543,13 @@ class Priems } /** - * @param int $uid на кого кастуем - * @param int $pr id приема + * @param int $uid на кого кастуем + * @param int $pr id приема * @param int|string $data дата, если -1, то добавляем дату3 - * @param int $d2 + * @param int $d2 * @param $tm - * @param int $h ход - * @param int $uu id юзера который использовал + * @param int $h ход + * @param int $uu id юзера который использовал * @param $max * @param $bj * @param $tp @@ -1614,7 +1578,8 @@ class Priems $noupdatebtl = 0, $noplus = 0, $pname = null - ) { + ) + { global $btl; //$pl = mysql_fetch_assoc(mysql_query('SELECT * FROM `priems` WHERE `id` = ' . (int)$pr)); $pl = Db::getRow('select * from priems where id = ?', [$pr]); @@ -1732,8 +1697,8 @@ class Priems /** Получает строку data c шаблонной записью типа add_m11=2*{lvl1} и конвертирует в реальную строку. *
Шаблон:
lvl1 = $uid[level]
ts5 = $uid[s5]
mpAll = $uid[mpAll] - * @param string $pl строка в формате data - * @param int $uid пользователь, параметры которого используются для подставки в шаблон. + * @param string $pl строка в формате data + * @param int $uid пользователь, параметры которого используются для подставки в шаблон. * @return string строка в формате data с развёрнутыми шаблонами. */ public function redate($pl, $uid) @@ -1981,8 +1946,7 @@ class Priems } else { //бьем противника с пропуском хода mysql_query( - 'INSERT INTO `battle_act` (`battle`,`uid1`,`uid2`,`time`,`out1`,`type`,`tpo1`) VALUES ("' . $btl->i->id . '","' . $this->u->info['id'] . '","' . $this->u->info['enemy'] . '","' . time( - ) . '","1","1","2")' + 'INSERT INTO `battle_act` (`battle`,`uid1`,`uid2`,`time`,`out1`,`type`,`tpo1`) VALUES ("' . $btl->i->id . '","' . $this->u->info['id'] . '","' . $this->u->info['enemy'] . '","' . time() . '","1","1","2")' ); } } @@ -2046,6 +2010,8 @@ class Priems } } + //выводим приемы $id - 1 (вне боя), 2 - в бою + /** Одеть приём в слот? * @param $id * @return void @@ -2086,11 +2052,11 @@ class Priems ); if ($upd) { TrainingManager::getInstance() - ->addPoint( - 'my_user_fourth_quest', function (TrainingManager $manager) { - $manager->store(); - } - ); + ->addPoint( + 'my_user_fourth_quest', function (TrainingManager $manager) { + $manager->store(); + } + ); $this->u->info['priems'] = $p; } } else { @@ -2099,28 +2065,15 @@ class Priems } } - //выводим приемы $id - 1 (вне боя), 2 - в бою - public function getTechniquesInfo(?int $id = null): array { - # SELECT * FROM `priems` WHERE `level`<="' . $this->u->info['level'] . '" AND `activ` > "0" AND `id` = "' . $id . '" LIMIT 1 - if (isset($id)) { return Db::getRow('select * from priems where level <= ? and activ > 0 and id = ? order by img,level', [$this->u->info['level'], $id]); - // return Db::getRow( - // 'select * from techniques_categories left join priems on techniques_categories.technique_id = priems.id - // where priems.level <= ? and priems.activ > 0 and priems.id = ? order by priems.img,priems.level', [User::start()->info['level'], $id] - // ); } return Db::getRows('select * from priems where level <= ? and activ > 0 order by img,level', [$this->u->info['level']]); - // return Db::getRows( - // 'select * from techniques_categories left join priems on techniques_categories.technique_id = priems.id - // where priems.level <= ? and priems.activ > 0 order by priems.img,priems.level', [User::start()->info['level']] - // ); } - public function seeMyPriems(): void { $i = 0; @@ -2172,7 +2125,7 @@ class Priems /** * Летит в js, двойные кавычки не использовать. * @param array $pl - * @param int $id + * @param int $id * @return array */ private function priemInfo(array $pl, int $id = -1): array @@ -2243,6 +2196,8 @@ class Priems return [0 => $lvar, 1 => $pz]; } + //Мощность / подавление / сопротивление и т.д. + /** * Генерирует html строку для вставки в JS $("#priems").html(" сюда "); * @return string @@ -2281,11 +2236,11 @@ class Priems $cl = 'href="javascript:void(0);" onClick="top.priemOnUser(' . $i . ',1,\'' . $pl['name'] . '\',\'' . $oninuser . '\',\'' . $pl['img'] . '\');"'; unset($oninuser); } else { - $cl = 'href="javascript:void(0);" onClick="usepriem(' . $i . ',1,\'' . $pl['img'] . '\');"'; + $cl = 'href="javascript:void(0);" onClick="usepriem(' . $i . ');"'; } } elseif ($pl['type'] == 2) { //длительное - $cl = 'href="javascript:void(0);" onClick="usepriem(' . $i . ',1,\'' . $pl['img'] . '\');"'; + $cl = 'href="javascript:void(0);" onClick="usepriem(' . $i . ');"'; } elseif ($pl['type'] == 3) { $cl = 'href="javascript:void(0);" onClick="alert(\'Возможно используем?\');"'; } @@ -2323,12 +2278,9 @@ class Priems $i++; } if ($this->u->info['animal'] > 0) { - $use_lst = $this->u->testAction( - '`uid` = "' . $this->u->info['id'] . '" AND `vars` = "animal_use' . $btl->i->id . '" LIMIT 1', - 1 - ); - if (!isset($use_lst['id'])) { - $pr .= ''; + $use_lst = (bool)ActionModel::testCount(["uid = {$this->u->info['id']}", "vars = animal_use{$btl->i->id}"]); + if (!$use_lst) { + $pr .= ''; } else { $pr .= ''; } @@ -2337,8 +2289,6 @@ class Priems return str_replace('"', '\\"', $pr); } - //Мощность / подавление / сопротивление и т.д. - public function getByCategory(?int $category_id = null) { @@ -2437,10 +2387,16 @@ class Priems ); } + /** + * Что-то для подключаемых файлов приёмов. + * + * @param $uid + * @param $mg + * @return bool|mysqli_result|resource + */ private function rezadEff($uid, $mg) { global $btl; - //$this->rezadEff($this->u->info['id'],'wis_fire_'); $md = ''; $md2 = ''; $ex = explode('|', $btl->users[$btl->uids[$uid]]['priems']); @@ -2787,7 +2743,7 @@ class Priems * Конечный damage после множителей делится на 5 и пишется в БД (atgm=). * Файлы: 33, 56, 57, 58, 59, 60. * @param $id - * @param array $pl массив значений из БД priems. + * @param array $pl массив значений из БД priems. * @param Battle $btl * @return void */ @@ -2819,7 +2775,7 @@ class Priems * Если есть одинаковые статы из них выбирается случайный. * Файл:267, приём 268. Понимай как хочешь. * @param $id - * @param array $pl + * @param array $pl * @param Battle $btl * @return void */ diff --git a/_incl_data/class/Quests.php b/_incl_data/class/Quests.php index c3246e42..ce73dd64 100644 --- a/_incl_data/class/Quests.php +++ b/_incl_data/class/Quests.php @@ -2,6 +2,7 @@ use Core\Db; use Helper\Conversion; +use Model\ActionModel; use User\ItemsModel; class Quests @@ -67,16 +68,18 @@ class Quests } //Сколько раз можно пройти квест if (isset($d['tr_raz'])) { - $qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" LIMIT ' . $d['tr_raz'], 2); - if ($d['tr_raz'] > 0 && $d['tr_raz'] - $qlst[0] <= 0) { + $qlst = ActionModel::testCount(["uid = {$u->info['id']}", "vars = start_quest{$pl['id']}"], $d['tr_raz']); + //$qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" LIMIT ' . $d['tr_raz'], 2); + if ($d['tr_raz'] > 0 && $d['tr_raz'] - $qlst <= 0) { $r = 0; } unset($qlst); } //Попыток пройти квест if (isset($d['tr_raz2'])) { - $qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" AND `vals` != "win" LIMIT ' . $d['tr_raz2'], 2); - if ($d['tr_raz2'] - $qlst[0] <= 0) { + $qlst = ActionModel::testCount(["uid = {$u->info['id']}", "vars = start_quest{$pl['id']}", "vals != go", "vals != win"], $d['tr_raz2']); + //$qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" AND `vals` != "win" LIMIT ' . $d['tr_raz2'], 2); + if ($d['tr_raz2'] - $qlst <= 0) { $r = 0; } unset($qlst); @@ -212,8 +215,7 @@ class Quests $bot2 = mysql_fetch_array(mysql_query('SELECT * FROM `test_bot` WHERE `id` = "' . $ex2[0] . '" LIMIT 1')); if (isset($bot2['id'])) { if (isset($qst['id'])) { - $x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $qst['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $ex2[1], 2); - $x2 = 0 + $x2[0]; + $x2 = ActionModel::testCount(["uid = {$u->info['id']}", "vars = win_bot_$ex2[0]", "time > {$qst['time']}"], $ex2[1]); } if (isset($d['all_kill']) && $d['all_kill'] > 0) { $r = $d['all_kill']; @@ -393,15 +395,17 @@ class Quests if ($d['tr_raz'] == -1) { $t .= 'Сколько еще раз можно выполнить задание: бесконечно
'; } else { - $qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" LIMIT ' . $d['tr_raz'], 2); - $t .= 'Сколько раз можно выполнить задание: ' . ($d['tr_raz'] - $qlst[0]) . '
'; + $qlst = ActionModel::testCount(["uid = {$u->info['id']}", "vars = start_quest{$pl['id']}"], $d['tr_raz']); + //$qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" LIMIT ' . $d['tr_raz'], 2); + $t .= 'Сколько раз можно выполнить задание: ' . ($d['tr_raz'] - $qlst) . '
'; } unset($qlst); } //Попыток пройти квест if (isset($d['tr_raz2'])) { - $qlst = $u->testAction('SELECT `id` FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" AND `vals` != "win" LIMIT ' . $d['tr_raz2'], 2); - $t .= 'Осталось попыток выполнить задание: ' . ($d['tr_raz2'] - $qlst[0]) . '
'; + $qlst = ActionModel::testCount(["uid = {$u->info['id']}", "vars = start_quest{$pl['id']}", "vals != go", "vals != win"], $d['tr_raz2']); + //$qlst = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" AND `vals` != "go" AND `vals` != "win" LIMIT ' . $d['tr_raz2'], 2); + $t .= 'Осталось попыток выполнить задание: ' . ($d['tr_raz2'] - $qlst) . '
'; unset($qlst); } @@ -479,28 +483,32 @@ class Quests //Убить ботов if (isset($d['kill_bot'])) { - + $ex = explode(',', $d['kill_bot']); if (isset($d['all_kill']) && (int)$d['all_kill'] > 0) { $x = ''; - $ex = explode(',', $d['kill_bot']); $i = 0; # Количество циклов для каждого типа бота. - $q = ''; + $botid = 0; + $sqlWhere = []; + $sqlParams = []; while ($i < count($ex)) { $ex2 = explode('=', $ex[$i]); - if ($q != '') { - $q .= ' OR '; - } - $q .= ' (`uid` = "' . $u->info['id'] . '" AND `time` > ' . $qst['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" )'; + $botid = $ex2[0]; + $sqlWhere[] = "(uid = :uid$i and time > :time$i and vars = :vars$i)"; + $sqlParams["uid$i"] = $u->info['id']; + $sqlParams["time$i"] = $qst['time']; + $sqlParams["vars$i"] = "win_bot_$ex2[0]"; $i++; } - $x2 = $u->testAction($q, 2); - $x2 = $x2[0]; + $sqlWhere = implode(' or ', $sqlWhere); + $x2 = ActionModel::testCountCustom($sqlWhere, $sqlParams); + if ($d['all_kill'] < $x2) { $x2 = $d['all_kill']; } - $bot2 = mysql_fetch_array(mysql_query('SELECT * FROM `test_bot` WHERE `id` = "' . $ex2[0] . '" LIMIT 1')); - if (isset($bot2['id'])) { - $x .= '    • ' . $bot2['login'] . ' [' . $x2 . '/' . $d['all_kill'] . ']
'; + + $botlogin = Db::getValue('select login from test_bot where id = ?', [$botid]); + if (isset($botlogin)) { + $x .= '    • ' . $botlogin . ' [' . $x2 . '/' . $d['all_kill'] . ']
'; } else { $x .= '    • ' . $pl['name'] . ' [' . $x2 . '/' . $d['all_kill'] . ']
'; } @@ -509,13 +517,12 @@ class Quests while ($i < count($ex)) { $x2 = 0; $ex2 = explode('=', $ex[$i]); - $bot2 = mysql_fetch_array(mysql_query('SELECT * FROM `test_bot` WHERE `id` = "' . $ex2[0] . '" LIMIT 1')); - if (isset($bot2['id'])) { + $botlogin = Db::getValue('select login from test_bot where id = ?', [$ex2[0]]); + if (isset($botlogin)) { if (isset($qst['id'])) { - $x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $qst['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $ex2[1], 2); - $x2 = 0 + $x2[0]; + $x2 = ActionModel::testCount(["uid = {$u->info['id']}", "vars = win_bot_$ex2[0]", "time > {$qst['time']}"], $ex2[1]); } - $x .= '    • ' . $bot2['login'] . ' [' . $x2 . '/' . $ex2[1] . ']
'; + $x .= '    • ' . $botlogin . ' [' . $x2 . '/' . $ex2[1] . ']
'; } $i++; } @@ -525,7 +532,7 @@ class Quests $x = trim($x, ', '); $t .= 'Убить ботов:
' . $x; } - unset($x, $ex, $x2, $bot2, $ex2); + unset($x, $ex, $x2, $ex2, $botlogin); } //Собрать ресурсы @@ -585,72 +592,86 @@ class Quests public function testquest(): void { global $u; - if ($u->info['battle'] == 0 && $u->room['name'] != 'Башня Смерти') { - $sp = mysql_query('SELECT * FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` LIKE "%start_quest%" AND `vals` = "go" LIMIT 100'); + if ($u->info['battle'] != 0 || $u->room['name'] === 'Башня Смерти') { + return; + } - while ($pl2 = mysql_fetch_array($sp)) { - $pl = mysql_fetch_array(mysql_query('SELECT * FROM `quests` WHERE `id` = "' . (str_replace('start_quest', '', $pl2['vars'])) . '" LIMIT 1')); + $sp = mysql_query('SELECT * FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` LIKE "%start_quest%" AND `vals` = "go" LIMIT 100'); - $g = 1; - //Действия квеста - $d = $this->expl($pl['act_date']); + while ($pl2 = mysql_fetch_array($sp)) { + $pl = mysql_fetch_array(mysql_query('SELECT * FROM `quests` WHERE `id` = "' . (str_replace('start_quest', '', $pl2['vars'])) . '" LIMIT 1')); - //Поговорить с NPS - if (isset($d['dlg_nps'])) { + $g = 1; + //Действия квеста + $d = $this->expl($pl['act_date']); + + //Поговорить с NPS + if (isset($d['dlg_nps'])) { + $g = 0; + unset($x); + } + + //Убить игроков + if (isset($d['kill_user'])) { + $x = 0; + if ($x < $d['kill_user']) { $g = 0; - unset($x); } - - //Убить игроков - if (isset($d['kill_user'])) { - $x = 0; - if ($x < $d['kill_user']) { + //$d['kill_user'] - стольких нужно убить + unset($x); + } + //Убить ботов + if (isset($d['kill_bot'])) { + $ex = explode(',', $d['kill_bot']); + $ii = 0; // Количество циклов для каждого типа бота. + $smth2 = 0; // неизвестное. + $sqlFilter = []; + $sqlParams = []; + while ($ii < count($ex)) { + $ex2 = explode('=', $ex[$ii]); + $smth2 = $ex2[1]; + $sqlFilter[] = "(uid = :uid$ii and time > :time$ii and vars = :vars$ii)"; + $sqlParams["uid$ii"] = $u->info['id']; + $sqlParams["time$ii"] = $pl2['time']; + $sqlFilter["vars$ii"] = "win_bot_$ex2[0]"; + $ii++; + } + $sqlFilter = implode(' or ', $sqlFilter); + if (isset($d['all_kill']) && $d['all_kill'] > 0) { + $x2 = ActionModel::testCountCustom($sqlFilter, $sqlParams, $d['all_kill']); + if ($x2 < $d['all_kill']) { $g = 0; } - //$d['kill_user'] - стольких нужно убить - unset($x); - } - //Убить ботов - if (isset($d['kill_bot'])) { - $ex = explode(',', $d['kill_bot']); - $ii = 0; // Количество циклов для каждого типа бота. - $q = ''; - while ($ii < count($ex)) { - $ex2 = explode('=', $ex[$ii]); - if ($q != '') { - $q .= ' OR '; - } - $q .= ' (`uid` = "' . $u->info['id'] . '" AND `time` > ' . $pl2['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" )'; - $ii++; + } else { + $x2 = ActionModel::testCountCustom($sqlFilter, $sqlParams, $smth2); + if (!isset($d['all_kill']) && $x2 < $smth2) { + $g = 0; } - if (isset($d['all_kill']) && $d['all_kill'] > 0) { - $x2 = $u->testAction($q . ' LIMIT ' . $d['all_kill'], 2); - if ($x2[0] < $d['all_kill']) { - $g = 0; - } - } else { - $x2 = $u->testAction($q . ' LIMIT ' . $ex2[1], 2); - if (!isset($d['all_kill']) && $x2[0] < $ex2[1]) { - $g = 0; - } - } - unset($x, $ex, $x2, $x3, $bot2, $ex2); } + } - //Собрать ресурсы - if (isset($d['tk_itm'])) { - $g = $this->collect_01(explode(',', $d['tk_itm']), $u); - } - //Собирание трофеев - if (isset($d['tkill_itm'])) { - $g = $this->collect_01(explode(',', $d['tkill_itm']), $u); - } - if ($g == 1) { - $pl['time'] = $pl2['time']; - $this->endq($pl['id'], 'win'); - $this->winQuest($pl); - echo $pl['name']; + //Собрать ресурсы + if (isset($d['tk_itm'])) { + $g = $this->collect_01(explode(',', $d['tk_itm']), $u); + } + //Собирание трофеев + if (isset($d['tkill_itm'])) { + $g = $this->collect_01(explode(',', $d['tkill_itm']), $u); + } + if ($g == 1) { + $pl['time'] = $pl2['time']; + $this->endq($pl['id'], 'win'); + $status = $this->winQuest($u->info['id'], $pl, $pl2['time']); + //Отправляем сообщение в чат + if ($status) { + $chatDto = new ChatMessage(); + $chatDto->setRoom($u->info['room']); + $chatDto->setTo($u->info['login']); + $chatDto->setText($status); + $chatDto->setType(5); + (new Chat())->sendMsg($chatDto); } + echo $pl['name']; } } } @@ -688,125 +709,117 @@ class Quests # Функция отвечает за ПРОВЕРКУ на ЗАВЕРШЕНИЕ квестов для ПОДЗЕМОК - private function winQuest($pl) + private function winQuest($uid, $pl, $time): string { - global $u, $c, $magic; + global $magic; - if (isset($pl['id'])) { - $d = $this->expl($pl['act_date']); - - $d = array_merge($d, $this->expl($pl['win_date'])); - - if ($_COOKIE['login'] == 'R' || $_COOKIE['login'] == 'r') { - echo ''; - die(); - } - - // Забираем ресурсы - if (isset($d['tk_itm'])) { - $ex = explode(',', $d['tk_itm']); - $i = 0; - while ($i < count($ex)) { - $ex2 = explode('=', $ex[$i]); - $ex2 = explode('=', $ex[$i]); - $x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $pl2['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $ex2[1], 2); - ItemsModel::deleteItemsById($ex2[0], $ex2[1]); - $i++; - } - } - // Забираем трофеи - if (isset($d['tkill_itm'])) { - $ex = explode(',', $d['tkill_itm']); - $i = 0; - while ($i < count($ex)) { - $ex2 = explode('=', $ex[$i]); - $ex2 = explode('=', $ex[$i]); - $x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $pl2['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $ex2[1], 2); - ItemsModel::deleteItemsById($ex2[0], $ex2[1]); - $i++; - } - } - - $t = ''; - if (isset($d['add_rep'])) { // Получаем репутацию за квест, если это убийства ботов. - if (isset($d['kill_bot']) && isset($d['all_kill']) && $d['add_rep'] > 0) { - $ex = explode(',', $d['kill_bot']); - $ii = 0; - $d['add_rep'] = 0; - while ($ii < count($ex)) { - $i = 0; - $ex2 = explode('=', $ex[$i]); - while ($i < $d['all_kill']) { - $x2 = 0; - $d['add_rep'] = $d['add_rep'] + $ex2[1]; - $x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $pl2['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $d['all_kill'], 2); - $i++; - } - $ii++; - } - } - unset($x, $i, $ii, $ex, $x2, $bot2, $ex2); - if ($pl['city'] != '') { - $t .= '' . $d['add_rep'] . ' ед. репутации ' . $pl['city'] . ', '; - $rep = mysql_fetch_array(mysql_query('SELECT * FROM `rep` WHERE `id` = "' . $u->info['id'] . '" LIMIT 1')); - - if ($rep['rep' . $pl['city']] < 24999 && $rep['rep' . $pl['city']] + $d['add_rep'] >= 24999 && $pl['kin'] != 2) { - $rep['rep' . $pl['city']] = 24999; - } else { - $rep['rep' . $pl['city']] += $d['add_rep']; - } - mysql_query('UPDATE `rep` SET `rep' . $pl['city'] . '` = "' . $rep['rep' . $pl['city']] . '" WHERE `id` = "' . $rep['id'] . '" LIMIT 1'); - } - } - - if (isset($d['add_repizlom'])) { - $t .= '' . $d['add_repizlom'] . ' ед. репутации Излома Хаоса, '; - $rep = mysql_fetch_array(mysql_query('SELECT * FROM `rep` WHERE `id` = "' . $u->info['id'] . '" LIMIT 1')); - $rep['repizlom'] += $d['add_repizlom']; - if ($rep['repizlom'] > 24999) { - $rep['repizlom'] = 24999; - } - mysql_query('UPDATE `rep` SET `repizlom` = "' . $rep['repizlom'] . '" WHERE `id` = "' . $rep['id'] . '" LIMIT 1'); - } - - if (isset($d['add_eff'])) { - $i = 0; - $j = explode('=', $d['add_eff']); - while ($i < count($j)) { - if ($j[$i] > 0) { - $magic->addEffect($u->info['id'], $j[$i], 1); - } - $i++; - } - } - - if (isset($d['add_cr'])) { - $t .= '' . $d['add_cr'] . ' кр., '; - mysql_query('UPDATE `users` SET `money` = `money`+' . $d['add_cr'] . ' WHERE `id` = "' . $u->info['id'] . '" LIMIT 1'); - } - - if ($t != '') { - $t = rtrim($t, ', '); - $r = 'Задание ' . $pl['name'] . ' было успешно выполнено! Вы получили награду: ' . $t . '.'; - unset($t); - } else { - $r = 'Задание ' . $pl['name'] . ' было успешно выполнено!'; - } - $r = '' . $r . ''; - //Отправляем сообщение в чат - $chatDto = new ChatMessage(); - $chatDto->setCity($u->info['city']); - $chatDto->setRoom($u->info['room']); - $chatDto->setTo($u->info['login']); - $chatDto->setText($r); - $chatDto->setType(5); - (new Chat())->sendMsg($chatDto); + if (!isset($pl['id'])) { + return ''; } + + $d = $this->expl($pl['act_date']); + + $d = array_merge($d, $this->expl($pl['win_date'])); + + if ($_COOKIE['login'] == 'R' || $_COOKIE['login'] == 'r') { + echo ''; + die(); + } + + // Забираем ресурсы + if (isset($d['tk_itm'])) { + $ex = explode(',', $d['tk_itm']); + $i = 0; + while ($i < count($ex)) { + $ex2 = explode('=', $ex[$i]); + $x2 = ActionModel::testCount(["uid = $uid", "vars = win_bot_$ex[2]", "time > $time"], $ex2[1]); + ItemsModel::deleteItemsById($ex2[0], $ex2[1]); + $i++; + } + } + // Забираем трофеи + if (isset($d['tkill_itm'])) { + $ex = explode(',', $d['tkill_itm']); + $i = 0; + while ($i < count($ex)) { + $ex2 = explode('=', $ex[$i]); + $x2 = ActionModel::testCount(["uid = $uid", "vars = win_bot_$ex[2]", "time > $time"], $ex2[1]); + ItemsModel::deleteItemsById($ex2[0], $ex2[1]); + $i++; + } + } + + $t = ''; + if (isset($d['add_rep'])) { // Получаем репутацию за квест, если это убийства ботов. + if (isset($d['kill_bot']) && isset($d['all_kill']) && $d['add_rep'] > 0) { + $ex = explode(',', $d['kill_bot']); + $ii = 0; + $d['add_rep'] = 0; + while ($ii < count($ex)) { + $i = 0; + $ex2 = explode('=', $ex[$i]); + while ($i < $d['all_kill']) { + $d['add_rep'] = $d['add_rep'] + (int)$ex2[1]; + $x2 = ActionModel::testCount(["uid = $uid", "vars = win_bot_$ex[2]", "time > $time"], $d['all_kill']); + $i++; + } + $ii++; + } + } + unset($x, $i, $ii, $ex, $x2, $bot2, $ex2); + if ($pl['city'] != '') { + $t .= '' . $d['add_rep'] . ' ед. репутации ' . $pl['city'] . ', '; + $rep = mysql_fetch_array(mysql_query('SELECT * FROM `rep` WHERE `id` = "' . $uid . '" LIMIT 1')); + + if ($rep['rep' . $pl['city']] < 24999 && $rep['rep' . $pl['city']] + $d['add_rep'] >= 24999 && $pl['kin'] != 2) { + $rep['rep' . $pl['city']] = 24999; + } else { + $rep['rep' . $pl['city']] += $d['add_rep']; + } + mysql_query('UPDATE `rep` SET `rep' . $pl['city'] . '` = "' . $rep['rep' . $pl['city']] . '" WHERE `id` = "' . $rep['id'] . '" LIMIT 1'); + } + } + + if (isset($d['add_repizlom'])) { + $t .= '' . $d['add_repizlom'] . ' ед. репутации Излома Хаоса, '; + $rep = mysql_fetch_array(mysql_query('SELECT * FROM `rep` WHERE `id` = "' . $uid . '" LIMIT 1')); + $rep['repizlom'] += $d['add_repizlom']; + if ($rep['repizlom'] > 24999) { + $rep['repizlom'] = 24999; + } + mysql_query('UPDATE `rep` SET `repizlom` = "' . $rep['repizlom'] . '" WHERE `id` = "' . $rep['id'] . '" LIMIT 1'); + } + + if (isset($d['add_eff'])) { + $i = 0; + $j = explode('=', $d['add_eff']); + while ($i < count($j)) { + if ($j[$i] > 0) { + $magic->addEffect($uid, $j[$i], 1); + } + $i++; + } + } + + if (isset($d['add_cr'])) { + $t .= '' . $d['add_cr'] . ' кр., '; + mysql_query('UPDATE `users` SET `money` = `money`+' . $d['add_cr'] . ' WHERE `id` = "' . $uid . '" LIMIT 1'); + } + + if ($t != '') { + $t = rtrim($t, ', '); + $r = 'Задание ' . $pl['name'] . ' было успешно выполнено! Вы получили награду: ' . $t . '.'; + unset($t); + } else { + $r = 'Задание ' . $pl['name'] . ' было успешно выполнено!'; + } + + return "$r"; } - public function questCheckEnd($pl) + public function questCheckEnd($pl): int { global $u; $quest = mysql_fetch_array(mysql_query('SELECT * FROM `actions` WHERE `uid` = "' . $u->info['id'] . '" AND `vars` = "start_quest' . $pl['id'] . '" ORDER BY `time` DESC LIMIT 1')); @@ -836,29 +849,31 @@ class Quests if (isset($d['kill_bot'])) { $ex = explode(',', $d['kill_bot']); $i = 0; # Количество циклов для каждого типа бота. - $q = ''; + $smth1 = 0; // неизвестно что. + $sqlFilter = []; + $sqlParams = []; while ($i < count($ex)) { $ex2 = explode('=', $ex[$i]); - if ($q != '') { - $q .= ' OR '; - } - $q .= ' (`uid` = "' . $u->info['id'] . '" AND `time` > ' . $quest['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" )'; + $smth1 = $ex2[1]; + $sqlFilter[] = "(uid = :uid$i and time > :time$i and vars = :vars$i)"; + $sqlParams[":uid$i"] = $u->info['id']; + $sqlParams[":time$i"] = $quest['time']; + $sqlParams[":vars$i"] = "win_bot_$ex2[0]"; $i++; } + $sqlFilter = implode(' or ', $sqlFilter); if (isset($d['all_kill']) && (int)$d['all_kill'] > 0) { - $x2 = $u->testAction($q, 2); - if ((int)$d['all_kill'] <= $x2[0]) { + $x2 = ActionModel::testCountCustom($sqlFilter, $sqlParams); + if ((int)$d['all_kill'] <= $x2) { $x2 = (int)$d['all_kill']; - } else { - $x2 = $x2[0]; } if ($x2 < (int)$d['all_kill']) { $g = 0; } } else { - $x2 = $u->testAction($q . ' LIMIT ' . $ex2[1], 2); - $x2 = min($ex2[1], $x2[0]); - if ($x2 < $ex2[1]) { + $x2 = ActionModel::testCountCustom($sqlFilter, $sqlParams, $smth1); + $x2 = min($smth1, $x2); + if ($x2 < $smth1) { $g = 0; } } @@ -886,10 +901,10 @@ class Quests $x2 = Db::getValue('select count(*) from items_users where maidin = ? and item_id = ? and uid = ? and `delete` in (0,1000) and inTransfer = 0 and inShop = 0', [$pl['city'], (int)$ex2[0], $u->info['id']]); if ($x2 >= $ex2[1]) { - if ($x2 <= ($ex2[1] + round($ex2[1] * 0.15))) { + if ($x2 <= ((int)$ex2[1] + round($ex2[1] * 0.15))) { $ex2[1] = $x2; } else { - $ex2[1] = ($ex2[1] + round($ex2[1] * 0.15)); + $ex2[1] = ((int)$ex2[1] + round($ex2[1] * 0.15)); } } if ($x2 < $ex2[1]) { @@ -928,10 +943,10 @@ class Quests $x2 = Db::getValue('select count(*) from items_users where maidin = ? and item_id = ? and uid = ? and `delete` in (0,1000) and inTransfer = 0 and inShop = 0', [$quest['city'], (int)$ex2[0], $u->info['id']]); if ($x2 >= $ex2[1]) { - if ($x2 <= ($ex2[1] + round($ex2[1] * 0.15))) { + if ($x2 <= ((int)$ex2[1] + round($ex2[1] * 0.15))) { $ex2[1] = $x2; } else { - $ex2[1] = ($ex2[1] + round($ex2[1] * 0.15)); + $ex2[1] = ((int)$ex2[1] + round($ex2[1] * 0.15)); } } $d['add_rep'] = (int)$d['add_rep'] * (int)$ex2[1]; @@ -953,9 +968,8 @@ class Quests $i = 0; $ex2 = explode('=', $ex[$i]); while ($i < $d['all_kill']) { - $x2 = 0; - $d['add_rep'] = $d['add_rep'] + $ex2[1]; - $x2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `time` > ' . $action['time'] . ' AND `vars` = "win_bot_' . $ex2[0] . '" LIMIT ' . $d['all_kill'], 2); + $d['add_rep'] = $d['add_rep'] + (int)$ex2[1]; + $x2 = ActionModel::testCount(["uid = {$u->info['id']}", "vars = win_bot_$ex2[0]", "time > {$action['time']}"], $d['all_kill']); $i++; } $ii++; diff --git a/_incl_data/class/User.php b/_incl_data/class/User.php index 3a541255..4a25f7ed 100644 --- a/_incl_data/class/User.php +++ b/_incl_data/class/User.php @@ -243,17 +243,6 @@ class User $this->statnames->getBonus(); $this->statnames->getRequirement(); - if (Core\Config::get('securetime') > 0) { - if (!defined('IP')) { - define('IP', $_SERVER['REMOTE_ADDR']); - } - - if (isset($this->info['id']) && ($this->info['ip'] != IP || $this->info['banned'] > 0) && $_SERVER['REQUEST_URI'] != '/') { - unset($this->info, $_COOKIE['login']); - die(Config::get('exit')); - } - } - if (!isset ($_COOKIE['btl'], $this->info['battle']) || $this->info['battle'] != $_COOKIE['btl']) { setcookie('btl', $this->info['battle'] ?? '', time() + 86400); } @@ -271,9 +260,9 @@ class User if ($sb - 1 > $this->info['catch'] - $this->info['frg']) { if ($this->info['frg'] == -1) { - $sm = $this->testAction('`uid` = "' . $this->info['id'] . '" AND `vars` = "frg" LIMIT 1', 1); + $sm = (bool)ActionModel::testCount(["uid = {$this->info['id']}", 'vars = frg']); } - if (!isset($sm['id']) && $this->info['frg'] == -1) { + if (!$sm && $this->info['frg'] == -1) { mysql_query( 'UPDATE `users` SET `catch` = "' . round( $sb @@ -298,6 +287,7 @@ class User ); } } + unset($sm); } if ($this->info['login2'] != '' && $this->info['battle'] == 0 && $this->info['zv'] == 0) { @@ -315,8 +305,7 @@ class User } if (isset($_GET['homeworld']) && $this->info['zv'] == 0 && $this->info['battle'] == 0 && $this->info['dnow'] == 0) { - $hgo = $this->testHome(); - if (!isset($hgo['id']) && $this->info['room'] != 274 && $this->info['align'] != 2 && $this->info['inTurnir'] == 0) { + if ($this->testHome() && $this->info['room'] != 274 && $this->info['align'] != 2 && $this->info['inTurnir'] == 0) { $this->addAction(time(), 'go_homeworld', ''); $rmt = mysql_fetch_array( mysql_query( @@ -351,7 +340,6 @@ class User } else { $this->error = 'Вам запрещено пользоваться кнопкой возрата'; } - unset($hgo); } //Заносим текст @@ -517,17 +505,14 @@ class User */ //Статистика персонажа на сегодня - $stat = $this->testAction( - '`uid` = "' . $this->info['id'] . '" AND `time` >= ' . strtotime( - 'now 00:00:00' - ) . ' AND `vars` = "statistic_today" LIMIT 1', 1 - ); - if (!isset($stat['id'])) { + $stat = (bool)ActionModel::testCount(["uid = {$this->info['id']}", "time >= " . strtotime('now 00:00:00'), 'vars = statistic_today']); + if (!$stat) { $this->addAction( time(), 'statistic_today', 'e=' . $this->info['exp'] . '|w=' . $this->info['win'] . '|l=' . $this->info['lose'] . '|n=' . $this->info['nich'] ); } + unset($stat); //Одеваем боевой комплект if (isset($_GET['usec1']) && $this->info['battle'] == 0) { @@ -611,11 +596,8 @@ class User } if (isset($_GET['obr_sel']) || isset($_GET['obraz'])) { - $sm = $this->testAction( - '`uid` = "' . $this->info['id'] . '" AND `time` > ' . (time() - 86400) . ' AND `vars` = "sel_obraz" LIMIT 1', - 1 - ); - if (!isset($sm['id'])) { + $obrazTimeout = ActionModel::getOne(["uid = {$this->info['id']}", 'time > unix_timestamp() - 86400', 'vars = sel_obraz'], 'time'); + if (!$obrazTimeout) { if (isset($_GET['obr_sel'])) { $tr = true; $o = mysql_fetch_array( @@ -686,7 +668,7 @@ class User } } else { $this->error = 'Выбирать образ можно не чаще одного раза в сутки, следующая смена ' . date( - 'd.m.Y H:i', $sm['time'] + 86400 + 'd.m.Y H:i', $obrazTimeout + 86400 ); unset($_GET['obr_sel']); $_GET['inv'] = 1; @@ -822,22 +804,6 @@ class User return Db::getRow('select * from users left join stats on users.id = stats.id where users.id = ?', [$id]); } - public function testAction($filter, $tp): array - { - if ($tp == 1) { - $query = 'select * from actions where ' . $filter; - } elseif ($tp == 2) { - $query = 'select count(*) from actions where ' . $filter; - } else { - return []; - } - $arr = mysql_fetch_array(mysql_query($query)); - - return !empty($arr) ? $arr : []; - } - - //Удаление определенного типа предметов - public function addAction($time, $vars, $vls, $uid = null): bool { $info = $this->info; @@ -848,7 +814,14 @@ class User return true; } - public function testHome(): array + //Удаление определенного типа предметов + + /** + * Кнопка "Возврат". + * + * @return bool + */ + public function testHome(): bool { /*----Быстрый(Особенность)----*/ $timeforwait = 3600; @@ -856,25 +829,27 @@ class User $timeforwait = 3600 - (($st['os6'] * 5) * 60); } /*----Быстрый(Особенность)----*/ - $hgo = $this->testAction( - '`uid` = "' . $this->info['id'] . '" AND `time` >= ' . (time() - $timeforwait) . ' AND `vars` = "go_homeworld" LIMIT 1', - 1 - ); - if ($this->info['level'] == 0 || $this->info['active'] != '' || $this->info['inTurnir'] > 0 || $this->info['inTurnirnew'] > 0 || $this->info['zv'] > 0 || $this->info['dnow'] > 0) { - $hgo['id'] = true; + $buttonUsed = (bool)ActionModel::testCount(["uid = {$this->info['id']}", "time >= unix_timestamp - $timeforwait", 'vars = go_homeworld']); + + if ( + $this->info['level'] == 0 || + $this->info['active'] != '' || + $this->info['inTurnir'] > 0 || + $this->info['inTurnirnew'] > 0 || + $this->info['zv'] > 0 || + $this->info['dnow'] > 0 || + !empty($this->info['noreal']) + ) { + $buttonUsed = true; } - if (isset($this->info['noreal']) || $this->info['dnow'] > 0) { - $hgo['id'] = true; - } - if (!isset($hgo['id'])) { - $ku = mysql_fetch_array( - mysql_query('SELECT `id` FROM `katok_zv` WHERE `uid` = ' . $this->info['id']) - ); - if (isset($ku['id'])) { - $hgo['id'] = true; + + if (!$buttonUsed) { + $onKatok = (bool)Db::getValue('select id from katok_zv where uid = ?', [$this->info['id']]); + if ($onKatok) { + $buttonUsed = true; } } - return $hgo ?? []; + return !$buttonUsed; } public function wipe() @@ -955,44 +930,41 @@ class User //Расчет урона от оружия - public function allActionsStart() + public function allActionsStart(): void { global $magic; + define('VAREZHKI_ITEM_ID', 998); + if (!isset($_GET['use_snowball'])) { return; } $this->stats = $this->getStats($this->info, 0); //Начинаем лепить снежок на ЦП - if (!isset($this->stats['items'][$this->stats['wp13id']]['id']) || $this->stats['items'][$this->stats['wp13id']]['item_id'] != 998) { + if (!isset($this->stats['items'][$this->stats['wp13id']]['id']) || $this->stats['items'][$this->stats['wp13id']]['item_id'] != VAREZHKI_ITEM_ID) { return; }//варежки одеты, все ок if ($this->room['name'] != 'Центральная площадь') { $this->error2 = 'Собирать снег можно только на Центральной площади'; - } else { - $smt = $this->testAction( - '`uid` = "' . $this->info['id'] . '" AND `time`>=' . (time() - 120) . ' AND `vars` = "create_snowball_cp" LIMIT 1', - 1 - ); - if (isset($smt['id'])) { - $this->error2 = 'Нельзя лепить несколько снежков одновременно ;)'; - } else { - $smt = $this->testAction( - '`uid` = "' . $this->info['id'] . '" AND `time`>=' . strtotime( - 'now 00:00:00' - ) . ' AND `vars` = "create_snowball_cp" LIMIT 25', - 2 - ); - $smt = $smt[0]; - if ($smt < 10) { - $this->addAction(time(), 'create_snowball_cp', $this->info['city']); - - $magic->addEffect($this->info['id'], 24); - $this->error2 = 'Начинаем лепить снежок, осталось ' . (10 - $smt) . ' раз на сегодня ...'; - } else { - $this->error2 = 'Вы уже слепили 10 снежка за сегодня ...'; - } - } + return; } + + $isMakingSnowball = (bool)ActionModel::testCount(["uid = {$this->info['id']}", "time >= unix_timestamp() - 120", 'vars = create_snowball_cp']); + + if ($isMakingSnowball) { + $this->error2 = 'Нельзя лепить несколько снежков одновременно ;)'; + return; + } + + $createdToday = ActionModel::testCount(["uid = {$this->info['id']}", 'vars = create_snowball_cp', 'time >= ' . strtotime('now 00:00:00')], 25); + + if ($createdToday >= 10) { + $this->error2 = 'Вы уже слепили 10 снежка за сегодня ...'; + return; + } + + $this->addAction(time(), 'create_snowball_cp', $this->info['city']); + $magic->addEffect($this->info['id'], 24); + $this->error2 = 'Начинаем лепить снежок, осталось ' . (10 - $createdToday) . ' раз на сегодня ...'; } //Расчет защиты @@ -2774,7 +2746,7 @@ class User Delo::add( 2, 'System.remont.upatack', - $u->info['id'], + $this->info['id'], '"System.remont.upatack": Заточка "' . $data['upatack_name'] . '" была успешно встроена в предмет "' . $id['name'] . '" [itm:' . $id['id'] . ']', ); @@ -4905,7 +4877,7 @@ class User return 0; } - $sleep = $this->testAction('`vars` = "sleep" AND `uid` = "' . $e['uid'] . '" LIMIT 1', 1); + $sleep = ActionModel::getOne(["uid = {$e['uid']}", 'vars = sleep'], 'vars'); if ($e['id_eff'] == 2) { //Проверка @@ -4929,6 +4901,7 @@ class User if (isset($po['finish_file']) && file_exists('_incl_data/class/Magic/' . $po['finish_file'] . '.php')) { require_once '_incl_data/class/Magic/' . $po['finish_file'] . '.php'; } + if (isset($u['id']) && ($e['type1'] < 11 || $e['type1'] > 16 && $e['type1'] < 23) && $e['noch'] == 0) { $text = "Закончилось действие эффекта «{$e['name']}»"; $cmsg = new ChatMessage(); @@ -6103,7 +6076,7 @@ LIMIT 1' 'UPDATE `items_users` SET `lastUPD` = "' . time() . '", `uid` = "' . $user['id'] . '", `data` = "' . $pl['data'] . '" WHERE `id` = "' . $pl['id'] . '"' ); mysql_query( - 'INSERT INTO `clan_operations` (`clan`, `time`, `type`, `text`, `val`, `uid`) VALUES ("' . $res['id'] . '", "' . time() . '", "' . $type . '", "' . $user['login'] . '", "' . $it_n['name'] . ' (x' . $col . ') Ид : [' . $pl['id'] . ']", "' . $user['id'] . '")' + 'INSERT INTO `clan_operations` (`clan`, `time`, `type`, `text`, `val`, `uid`) VALUES ("' . $cl . '", "' . time() . '", "' . $type . '", "' . $user['login'] . '", "' . $it_n['name'] . ' (x' . $col . ') Ид : [' . $pl['id'] . ']", "' . $user['id'] . '")' ); } elseif ($pl['uid'] == $user['id']) { $col = $this->itemsX(((int)$pl['id'])); @@ -6114,7 +6087,7 @@ LIMIT 1' 'UPDATE `items_users` SET `lastUPD` = "' . time() . '", `uid` = "-21' . $user['clan'] . '" WHERE `id` = "' . $pl['id'] . '"' ); mysql_query( - 'INSERT INTO `clan_operations` (`clan`, `time`, `type`, `text`, `val`, `uid`) VALUES ("' . $res['id'] . '", "' . time() . '", "9", "' . $user['login'] . '", "' . $it_n['name'] . ' (x' . $col . ') Ид : [' . $pl['id'] . ']", "' . $user['id'] . '")' + 'INSERT INTO `clan_operations` (`clan`, `time`, `type`, `text`, `val`, `uid`) VALUES ("' . $cl . '", "' . time() . '", "9", "' . $user['login'] . '", "' . $it_n['name'] . ' (x' . $col . ') Ид : [' . $pl['id'] . ']", "' . $user['id'] . '")' ); } } diff --git a/_incl_data/class/User/Confirmation.php b/_incl_data/class/User/Confirmation.php index e4d0fc25..37dec423 100644 --- a/_incl_data/class/User/Confirmation.php +++ b/_incl_data/class/User/Confirmation.php @@ -6,30 +6,24 @@ use Core\Config; use Core\Db; use Helper\Mail; use PassGen; -use UserIp; class Confirmation { /** * Для однотипных писем с подтверждением. * @param array $userinfo Данные из (User)->info. - * @param mixed $value Новое значение + * @param string $value Новое значение * @param ?int $code Проверочный код * @param string $type Тип меняемого значения. С маленькой буквы, именительный падеж. * @return void */ - public static function byEmail(array $userinfo, string $type, $value, ?int $code = null) + public static function byEmail(array $userinfo, string $type, string $value, ?int $code = null): void { - if ($type === 'pass2' && is_null($code)) { - self::pass2ByEmailCustom($userinfo, $value); - return; - } $ip = UserIp::get(); $date = date('d.m.y H:i'); $https = Config::get('https'); $support = Config::get('support'); - $activationLink = 'https://' . $userinfo['city'] . Config::get('host') . - "/confirm.php?id={$userinfo['id']}&code=$code"; + $activationLink = Config::get('https') . "/confirm.php?id={$userinfo['id']}&code=$code"; $fulllogin = $userinfo['login'] . "[{$userinfo['level']}]"; Mail::send( $userinfo['mail'], @@ -55,31 +49,7 @@ class Confirmation ); } - private static function pass2ByEmailCustom(array $userinfo, string $pass2) - { - - $ip = UserIp::get(); - $fulllogin = $userinfo['login'] . "[{$userinfo['level']}]"; - Mail::send( - $userinfo['mail'], - << - Второй пароль от персонажа $fulllogin. - - Вами, с IP адреса - $ip, был установлен второй пароль в игре Бойцовский Клуб.
- Если это были не Вы, свяжитесь с администрацией сайта.

- ------------------------------------------------------------------
- Ваш логин | {$userinfo['login']}
- Второй пароль | ' . $pass2 . '
- ------------------------------------------------------------------
-

Желаем Вам приятной игры.

Администрация - - HTML, - "Второй пароль от персонажа $fulllogin" - ); - } - - public static function userRegistrationCodeByEmail(string $email, string $login) + public static function userRegistrationCodeByEmail(string $email, string $login): void { $code = PassGen::intCode(4); Db::sql('insert into secure_code (email, code, time) values (?,?,unix_timestamp())', [$email, $code]); diff --git a/_incl_data/class/User/InfoBox.php b/_incl_data/class/User/InfoBox.php index b4b2b9cc..b5363910 100644 --- a/_incl_data/class/User/InfoBox.php +++ b/_incl_data/class/User/InfoBox.php @@ -113,7 +113,7 @@ class InfoBox $lvar = $this->getInfoItemInfo($pl, $td); - if (isset($sn['items_img'][$tp_img[$pl['inOdet']]])) { + if (isset($tp_img[$pl['inOdet']], $sn['items_img'][$tp_img[$pl['inOdet']]])) { $uimg = 'rimg/r' . $sn['items_img'][$tp_img[$pl['inOdet']]]; } else { $uimg = 'i/items/' . $pl['img']; @@ -469,7 +469,7 @@ class InfoBox if ($u['banned'] > 0) { $pb .= '
Персонаж заблокирован
'; } - if ($u['allLock'] > time()) { + if (isset($u['allLock']) && $u['allLock'] > time()) { $pb .= '
Временный запрет передач!
'; } diff --git a/_incl_data/class/User/ItemsModel.php b/_incl_data/class/User/ItemsModel.php index b3969e96..1f2763a5 100644 --- a/_incl_data/class/User/ItemsModel.php +++ b/_incl_data/class/User/ItemsModel.php @@ -211,4 +211,9 @@ class ItemsModel } return $rt; } + + public static function addIznos(int $itemId): void + { + Db::sql('update items_users set iznosNOW = iznosNOW + 1 where id = ?', [$itemId]); + } } \ No newline at end of file diff --git a/_incl_data/class/User/Password.php b/_incl_data/class/User/Password.php index b67060e8..e2821a45 100644 --- a/_incl_data/class/User/Password.php +++ b/_incl_data/class/User/Password.php @@ -57,28 +57,5 @@ class Password } return $this->info['pass']; } - - public function changeSecond(?int $passLength): array - { - if (in_array($passLength, [4, 6, 8])) { - $query = 'update users set pass2 = ? where id = ?'; - $pass2 = PassGen::intCode($passLength); - $args = [ - password_hash($pass2, PASSWORD_DEFAULT), - $this->info['id'], - ]; - Confirmation::byEmail($this->info, 'pass2', $pass2); - $hash = $args[0]; - } else { - $query = 'update users set pass2 = default where id = ?'; - $args = [$this->info['id']]; - } - - Db::sql($query, $args); - return [ - 'pass2' => $pass2 ?? '', - 'hash' => $hash ?? null, - ]; - } } diff --git a/_incl_data/class/User/Register.php b/_incl_data/class/User/Register.php index 205bc11e..24e63757 100644 --- a/_incl_data/class/User/Register.php +++ b/_incl_data/class/User/Register.php @@ -57,12 +57,6 @@ class Register 'effects' => [8, 20, 25, 37, 38, 283, 296, 412, 472], ], ]; - private array $restrictedLogins = [ - 'ангел', 'angel', 'администрация', 'administration', 'Комментатор', - 'Мироздатель', 'Мусорщик', 'Падальщик', 'Повелитель', - 'Архивариус', 'Пересмешник', 'Волынщик', 'Лорд Разрушитель', - 'Милосердие', 'Справедливость', 'Искушение', 'Вознесение', - ]; public function hasGoodEmail(string $email): bool { @@ -141,40 +135,30 @@ class Register public function hasGoodLogin(string $login): bool { - $isRestricted = in_array($login, $this->restrictedLogins); - $isRegistered = Db::getValue('select count(*) from users where login = ?', [$login]); - //Бывшие в употреблении логины. Дичь, но ладно. - $wasRegistered = Db::getValue('select count(*) from lastnames where login = ?', [$login]); - $login = str_replace(' ', ' ', $login); - if (mb_strlen($login) > 20) { - $this->error = 'Логин должен содержать не более 20 символов.'; - } - if (mb_strlen($login) < 4) { - $this->error = 'Логин должен содержать не менее 4 символов.'; - } - if ($this->hasMixedLatCur($login)) { - $this->error = 'В логине разрешено использовать только буквы одного алфавита русского или английского. Нельзя смешивать.'; - } - if (substr_count($login, ' ') + substr_count($login, '-') + substr_count($login, '_') > 2) { - $this->error = 'Не более двух разделителей одновременно (пробел, тире, нижнее подчеркивание).'; - } - if (!empty($this->error)) { + $validator = (new \Validator\Login())->setLogin($login); + if (!$validator->check()) { + $this->error = match ($validator->getErrorCode()) { + 1 => 'Логин ' . $login . ' уже занят, выберите другой.', + 2 => 'В логине разрешено использовать только буквы одного алфавита русского или английского. Нельзя смешивать.', + 3 => 'Логин должен содержать не менее ' . $validator::LENGTH['min'] . ' символов.', + 4 => 'Логин должен содержать не более ' . $validator::LENGTH['max'] . ' символов.', + 5 => 'Не более двух разделителей одновременно (пробел, тире, нижнее подчеркивание).', + 6 => 'В логине используются запрещённые символы.', + }; $this->error .= '
Пример правильного никнейма: Петя Убиватор, Коля, xalop.
Пример неправильного никнейма: )))), kolя)=-/.'; - } - if ($isRegistered || $wasRegistered || $isRestricted) { - $this->error = 'Логин ' . $login . ' уже занят, выберите другой.'; + } else { + $login = $validator->get(); + $isRegistered = Db::getValue('select count(*) from users where login = ?', [$login]); + //Бывшие в употреблении логины. Дичь, но ладно. + $wasRegistered = Db::getValue('select count(*) from lastnames where login = ?', [$login]); + if ($isRegistered || $wasRegistered) { + $this->error = 'Логин ' . $login . ' уже занят, выберите другой.'; + } } return !$this->error; } - public function hasMixedLatCur(string $txt): bool - { - $en = preg_match("/^(([0-9A-z -])+)$/iu", $txt); - $ru = preg_match("/^([а-яёіїє\s\d]*)$/iu", $txt); - return ($ru && $en) || (!$ru && !$en); - } - private function setCookies($login): void { setcookie('login', 1, 1, '/', Config::get('host'), true); diff --git a/_incl_data/class/User/Stats.php b/_incl_data/class/User/Stats.php index 6570d85a..7fa7fef1 100644 --- a/_incl_data/class/User/Stats.php +++ b/_incl_data/class/User/Stats.php @@ -124,6 +124,54 @@ class Stats ]; } + public static function saveBattleStats(array $stats, int $id): void + { + if (!isset( + $stats['hpnow'], + $stats['mpNow'], + $stats['tactic1'], + $stats['tactic2'], + $stats['tactic3'], + $stats['tactic4'], + $stats['tactic5'], + $stats['tactic6'], + $stats['tactic7'], + $stats['enemy'], + $stats['battle_yron'], + $stats['battle_exp'], + $stats['last_hp'], + $stats['priems_z'], + ) + ) { + return; + } + + Db::sql( + 'update stats set hpNow = ?,mpNow = ?, + tactic1 = ?,tactic2 = ?,tactic3 = ?,tactic4 = ?,tactic5 = ?,tactic6 = ?,tactic7 = ?, + enemy = ?,battle_yron = ?,last_hp = ?,battle_exp = ?,priems_z = ? + where id = ?', + [ + $stats['hpnow'], + $stats['mpNow'], + $stats['tactic1'], + $stats['tactic2'], + $stats['tactic3'], + $stats['tactic4'], + $stats['tactic5'], + $stats['tactic6'], + $stats['tactic7'], + $stats['enemy'], + $stats['battle_yron'], + $stats['battle_exp'], + $stats['last_hp'], + $stats['priems_z'], + $id, + ] + ); + + } + public function getStats(int|array|null $uid = null, $i1 = 0, $reimg = false, $btl_cache = false): array { $u = match (true) { @@ -205,6 +253,7 @@ class Stats $noeffectbattle = false; if ($u['battle'] > 0) { $noeffectbattle = (bool)Db::getValue("select 1 from battle_actions where uid = ? and vars = 'noeffectbattle1' and btl = ? limit 1", [$u['id'], $u['battle']]); + $st['team'] = $u['team']; } //Характеристики от эффектов @@ -293,9 +342,6 @@ class Stats $st['m19'] += (int)($st['s3'] * 0.03); - - - //Бонусы комплектов if (isset($coms['new']) && is_iterable($coms['new'])) { foreach ($coms['new'] as $complect) { @@ -477,8 +523,8 @@ class Stats /** Собираем динамически создаваемые параметры. Если ключа нет - создаём. * @param string $key - * @param int $value - * @param array $st + * @param int $value + * @param array $st * @return void */ private function addKeyIfNotExist(string $key, int $value, array &$st): void @@ -493,7 +539,7 @@ class Stats /** * Добавляет бонусы к статам игрока. * Генерирует переменную User:class->stats['items'], где лежат одетые предметы. - * @param int $uid + * @param int $uid * @param array $st * @param array $s_v * @param array $baseStats @@ -1081,6 +1127,10 @@ class Stats 0 as finished from rep where id = ?', [$id] ); + if (empty($finishedDungeons)) { + return; + } + //Бонус за количество полностью вырытых пещер. if (isset($st['m10'])) { $st['m10'] += 10 * $finishedDungeons; @@ -1133,52 +1183,4 @@ class Stats } unset($st['level'], $st['hpnow'], $st['mpnow'], $st['hpall'], $st['mpall']); } - - public static function saveBattleStats(array $stats, int $id): void - { - if (!isset( - $stats['hpnow'], - $stats['mpNow'], - $stats['tactic1'], - $stats['tactic2'], - $stats['tactic3'], - $stats['tactic4'], - $stats['tactic5'], - $stats['tactic6'], - $stats['tactic7'], - $stats['enemy'], - $stats['battle_yron'], - $stats['battle_exp'], - $stats['last_hp'], - $stats['priems_z'], - ) - ) { - return; - } - - Db::sql( - 'update stats set hpNow = ?,mpNow = ?, - tactic1 = ?,tactic2 = ?,tactic3 = ?,tactic4 = ?,tactic5 = ?,tactic6 = ?,tactic7 = ?, - enemy = ?,battle_yron = ?,last_hp = ?,battle_exp = ?,priems_z = ? - where id = ?', - [ - $stats['hpnow'], - $stats['mpNow'], - $stats['tactic1'], - $stats['tactic2'], - $stats['tactic3'], - $stats['tactic4'], - $stats['tactic5'], - $stats['tactic6'], - $stats['tactic7'], - $stats['enemy'], - $stats['battle_yron'], - $stats['battle_exp'], - $stats['last_hp'], - $stats['priems_z'], - $id, - ] - ); - - } } diff --git a/_incl_data/class/Validator/Login.php b/_incl_data/class/Validator/Login.php new file mode 100644 index 00000000..6fad4349 --- /dev/null +++ b/_incl_data/class/Validator/Login.php @@ -0,0 +1,67 @@ + 4, 'max' => 16]; + protected readonly string $login; + private int $errorcode = 0; + + public function getErrorCode(): int + { + return $this->errorcode; + } + + public function setLogin(string $login): self + { + $login = preg_replace('!\s+!', ' ', $login); // remove inner spaces + $login = trim($login); // remove outer spaces + $this->login = $login; + return $this; + } + + public function get(): string + { + return $this->check() ? $this->login : ''; + } + + public function check(): bool + { + if (!$this->isAllowed()) { + $this->errorcode = 1; + } elseif ($this->isMixed()) { + $this->errorcode = 2; + } elseif (mb_strlen($this->login) < self::LENGTH['min']) { + $this->errorcode = 3; + } elseif (mb_strlen($this->login) > self::LENGTH['max']) { + $this->errorcode = 4; + } elseif (substr_count($this->login, ' ') + substr_count($this->login, '-') + substr_count($this->login, '_') > 2) { + $this->errorcode = 5; + } elseif (strpos("!@#$%^&*()\+|/'\"", $this->login) || empty($this->login)) { + $this->errorcode = 6; + } + + return $this->errorcode === 0; + } + + private function isAllowed(): bool + { + $d = implode('|', self::RESTRICTED); + $pattern = "/\b($d)\b/iu"; + return !preg_match($pattern, $this->login); + } + + private function isMixed(): bool + { + $en = preg_match("/^(([0-9A-z -])+)$/iu", $this->login); + $ru = preg_match("/^([а-яёіїє\s\d]*)$/iu", $this->login); + return ($ru && $en) || (!$ru && !$en); + } +} diff --git a/adminion/oltest.js b/adminion/oltest.js new file mode 100644 index 00000000..5f0c2343 --- /dev/null +++ b/adminion/oltest.js @@ -0,0 +1,65 @@ +const img = '//img.new-combats.com/i'; + +const gett = async () => { + let response = await fetch('/api/onlinelist.php'); + if (response.ok) { + document.getElementById('onlinelist').innerHTML = ''; + const list = await response.json(); + list.forEach((user) => { + console.log(user); + document.getElementById('onlinelist').insertAdjacentHTML('beforeend', `${ol.makelogin(user)}
`); + }); + } else { + document.getElementById('onlinelist').insertAdjacentHTML('beforeend', `Все ушли.
`); + } +}; + +window.addEventListener('load', () => { + const fetchInterval = 10000; // 10 секунд. + gett; + //(get)(); // почему get; или get(); - неправильно?? 🤬😭 + setInterval(gett, fetchInterval); +}); + +ol = { + tochat (login) { + const input = document.getElementById('tochat'); + if (input.value === `private [${login}]`) { + return; + } + if (input.value === `to [${login}]`) { + input.value = `private [${login}]`; + return; + } + input.value = `to [${login}]`; + }, + + makelogin ({id, login, level, align, clan, inbattle, isadmin}) { + let style = ''; + if (isadmin) { + //align = 2.9; + style = `color: crimson;`; + } + if (!level || level < 0 || level > 21 && !isadmin || typeof level !== 'number') { + level = '??'; + } + let inficon = `Информация про ${login}`; + let html = `${login}[${level}]` + inficon; + if (clan) { + html = `Клан ` + html; + } + if (align) { + html = `Склонность ` + html; + } + + let battleyes = '', battlealt = ''; + if (inbattle) { + battleyes = 1; + battlealt = ' (персонаж в поединке)' + } + html = `Приват${battlealt}` + html; + + return html; + } +}; + diff --git a/adminion/onlinelist.php b/adminion/onlinelist.php new file mode 100644 index 00000000..b5698e25 --- /dev/null +++ b/adminion/onlinelist.php @@ -0,0 +1,22 @@ + 1, 'login' => 'Paladin', 'align' => 1.9, 'level' => 4], + ['id' => 2, 'login' => 'ClanUser', 'clan' => 100, 'level' => 5], + ['id' => 3, 'login' => 'AlignClanUser', 'align' => 23, 'clan' => 120, 'level' => 'text'], + ['id' => 4, 'login' => 'User', 'level' => -1], + ['id' => 5, 'login' => 'UserInBattle', 'battle' => true, 'level' => 100500], + ['id' => 6, 'login' => 'Admin', 'battle' => true, 'admin' => true], +]; +?> + + + + +onlinelist + + + +
+ diff --git a/adminion/priems.php b/adminion/priems.php new file mode 100644 index 00000000..cb61cc9d --- /dev/null +++ b/adminion/priems.php @@ -0,0 +1,95 @@ +names[$nrow['sys_name']] = $nrow['name']; + } + // Несовпадения по именам. + $this->names['lvl'] = $this->names['level']; + + $this->printAll(); + $this->printUnknown(); + } + + private function printer(array $data, string $title): string + { + $result = ''; + foreach ($data as $k=>$v) { + if ($k === array_key_first($data)) { + $result .= "
$title: "; + } + $result .= $this->namer($k, $v); + } + return $result; + } + private function printAll(): void + { + foreach (Db::getRows('select name, info, date2, date3, id, tr from priems order by name') as $prow) { + $d2 = Conversion::dataStringToArray($prow['date2']); + $d3 = Conversion::dataStringToArray($prow['date3']); + $tr = Conversion::dataStringToArray($prow['tr']); + + $d2s = $this->printer($d2, 'date2'); + $d3s = $this->printer($d3, 'date3'); + $trs = $this->printer($tr, 'Требуется'); + + $dallk = array_flip(array_keys(array_merge($d2, $d3, $tr))); + $this->parameters = array_merge($dallk, $this->parameters); + echo "
{$prow['name']} id:{$prow['id']}
{$prow['info']} $trs $d2s $d3s
"; + } + } + private function namer($k, $v): string + { + return match (true) { + $this->names[$k] => "
$this->names[$k] = $v", + str_starts_with($k, 'add_') && $this->names[str_replace('add_', '', $k)] => "
{$this->names[str_replace('add_', '', $k)]} = $v", + str_starts_with($k, 'tr_') && $this->names[str_replace('tr_', '', $k)] => "
{$this->names[str_replace('tr_', '', $k)]} = $v", + default => "
$k = $v", + }; + } + + private function printUnknown(): void + { + $sorted = []; + foreach ($this->parameters as $pa=>$va) { + if ($this->names[str_replace('add_', '', $pa)] || $this->names[str_replace('tr_', '', $pa)]) { + continue; + } + $sorted[] = $pa; + } + + echo '
Неизвестные параметры:
'; + foreach (array_chunk($sorted, 10) as $re) { + echo implode(', ', $re) . '
'; + } + } +} + + +echo << +@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono&display=swap'); +body {font-family: 'JetBrains Mono', monospace; font-size: small; background-color: lavender;} +hr {border: 1px solid darkgreen;} +i {color: dimgrey;} +div {margin: 10px 0; padding: 4px; background-color: ghostwhite;} +div > b:first-child {margin-left: 5px; color: darkslategrey;} +div > b:first-child:before {content: '⭕ '} + +HTML; + +$np = new ShowPriems(); diff --git a/adminion/sms.php b/adminion/sms.php new file mode 100644 index 00000000..2c35a29e --- /dev/null +++ b/adminion/sms.php @@ -0,0 +1,18 @@ + 0 and banned = 0 and bot = 0 order by id desc'); +$tbl = [['Логин', 'Стоимость вещей кр', 'Стоимость вещей екр', 'Всего кр с учётом вещей', 'Всего екр с учётом вещей']]; +foreach ($users as $user) { + $itemsprices = Db::getRow('select sum(`1price`) as sumkr, sum(`2price`) as sumekr from items_users where uid = ?', [$user['id']]); + $allkr = $user['money'] + $itemsprices['sumkr']; + $allekr = $user['money2'] + $itemsprices['sumekr']; + $tbl[] = [User::getLogin($user['id']), $itemsprices['sumkr'] ?? 0, $itemsprices['sumekr'] ?? 0, $allkr, $allekr]; +} +echo Table::get($tbl); diff --git a/spam.php b/adminion/spam.php similarity index 100% rename from spam.php rename to adminion/spam.php diff --git a/adminion/test.php b/adminion/test.php new file mode 100644 index 00000000..a8567eba --- /dev/null +++ b/adminion/test.php @@ -0,0 +1,53 @@ + 'eta', 'bar' => 'bingo', 'baz' => 'quatro', 'mill' => 'buratino erra stupido']; + +\Core\Debug::x(); + +//$f1 = new Fighter(27319412, 4); +$f2 = new Fighter(27205347, 2); +//echo $f1; +echo $f2; +//var_dump($f1); +$u = User::start(27205347); +var_dump($u->stats['items'], $u->stats); + +?> + + + + + + + + + diff --git a/ajax_checklogin.php b/ajax_checklogin.php index eeda5e7d..76c4b42d 100644 --- a/ajax_checklogin.php +++ b/ajax_checklogin.php @@ -1,102 +1,39 @@ 1, - 'Мироздатель' => 1, -]; -// -function en_ru($txt) -{ - $g = false; - $en = preg_match("/^(([0-9a-zA-Z _-])+)$/i", $txt); - $ru = preg_match("/^(([0-9а-яА-Я _-])+)$/i", $txt); - if (($ru && $en) || (!$ru && !$en)) { - $g = true; - } - return $g; -} -// -function testBad($txt): bool -{ - $white = '-_ 0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNMЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю'; - $r = false; - $i = 0; - while ($i != -1) { - if (isset($txt[$i])) { - $g = false; - $j = 0; - while ($j != -1) { - if (isset($white[$j])) { - if ($white[$j] == $txt[$i]) { - $g = true; - } - } else { - $j = -2; - } - $j++; - } - if ($g == false) { - $r = true; - } - } else { - $i = -2; +$validator = new class extends Login { + private function exist(): bool + { + return Db::getValue('select count(login) from users where login = ?', [$this->login]) > 0; + } + + public function getstatus(): string + { + if ($this->exist()) { + return 'Логин занят.'; } - $i++; + if (parent::check()) { + return 'Логин свободен!'; + } + return 'Неверный логин.'; } - return $r; -} +}; -// -$login = mysql_fetch_array( - mysql_query( - 'SELECT `id` FROM `users` WHERE `login` = "' . mysql_real_escape_string($_GET['login']) . '" LIMIT 1' - ) -); -if (isset($login['id']) || isset($bad[$_GET['login']])) { - echo 'Логин занят.'; -} else { - $true = true; +echo $validator->setLogin($_GET['login'])->getstatus(); - /* - Логин может содержать от 4 до 16 символов, и состоять только из букв русского ИЛИ английского алфавита, цифр, символов '_', '-' и пробела. - Логин не может начинаться или заканчиваться символами '_', '-' или пробелом. - */ - - $_GET['login'] = str_replace(' ', ' ', $_GET['login']); - $_GET['login'] = str_replace('%', ' ', $_GET['login']); - $_GET['login'] = str_replace(' ', ' ', $_GET['login']); - // - if (strlen($_GET['login']) > 16) { - $true = false; - } elseif (strlen($_GET['login']) < 4) { - $true = false; - } elseif (strripos($_GET['login'], ' ')) { - $true = false; - } elseif (substr($_GET['login'], 1) == ' ' || substr($_GET['login'], -1) == ' ') { - $true = false; - } elseif (substr($_GET['login'], 1) == '-' || substr($_GET['login'], -1) == '-') { - $true = false; - } elseif (substr($_GET['login'], 1) == '_' || substr($_GET['login'], -1) == '_') { - $true = false; - } elseif (testBad($_GET['login'])) { - $true = false; - } elseif (en_ru(str_replace('ё', 'е', str_replace('Ё', 'Е', $_GET['login'])))) { - $true = false; - } - // - if (!$true) { - echo 'Неверный логин.'; - } else { - echo 'Логин свободен!'; - } -} +//todo Написать класс, который будет использоваться тут, в ekr.php, в _newanimal.php и в проверках при регистрации. +//todo При этом сюда стоит подтягивать наследование класса, в который просто добавляется проверка на exist() которая не нужна в других местах. +//todo function testBad($txt), function is_login($login), function en_ru($txt) diff --git a/audio.php b/audio.php index a612340d..04aa84c1 100644 --- a/audio.php +++ b/audio.php @@ -1,3 +1,3 @@ - - -Благодать Алхимика - - - - - - - - - - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -

Состояние счета:

- -№ 3991930370 -Пополнить - - -0.00 кр -0.17 екр - - - -
-
Скорость передвижения +20%.....
Скорость восстановления Здоровья и Маны +50%.....
Ускоренное получение репутации Ангелов +100%.....
Нет ослабления после боя.....
Бонус к получаемому опыту +50%.....
Бонус к получаемой репутации в подземельях +50%.....
Задержка на посещение подземелий -30%
+1 дополнительный поход в сутки
.....
Дополнительный бросок вероятности на выпадение дропа в подземельях .....
Уменьшение задержки на телепортацию между городами на 50%.....
Экипировка не ломается.....
Дополнительный слот сумки.....
Комиссия на аукционе 2.5%.....
Скидка на ремонт 50%.....
Бонус к получаемому благородству +50%.....
Бонус к получаемому клановому опыту +50%.....
Скидка в магазинах при покупке за еврокредиты +5%.....
2.00 екр4.00 екр7.00 екр15.00 екр30.00 екр
-
-
- -
- - -
- -
-
-
-
-
- -
- - -
- -
-
-
-
-
- -
- - -
- -
-
-
-
-
- -
- - -
- -
-
-
-
-
- -
- - -
- -
-
-
- -
-

-
- - \ No newline at end of file diff --git a/buttons.php b/buttons.php index 4cd0b7a1..d4d514ac 100644 --- a/buttons.php +++ b/buttons.php @@ -1162,8 +1162,6 @@ if (!isset($_COOKIE['d1c'])) { info['active'] != '' && $u->info['mail'] != 'No E-mail') { - $yes = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `vars` = "user_active_good" LIMIT 1', 1); - $yes2 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `vars` = "user_active_send" LIMIT 1', 1); Db::sql('update stats set active = default where id = ?', [$u->info['id']]); } ?> diff --git a/clans_inf.php b/clans_inf.php index 8af14e26..905176c1 100644 --- a/clans_inf.php +++ b/clans_inf.php @@ -21,7 +21,6 @@ if ($uplogin != 'delete' && $utf8Login != 'delete' && $utf8Login2 != 'delete') { if (!isset($clan['id'])) { die( ' - Произошла ошибка

@@ -29,7 +28,6 @@ if (!isset($clan['id'])) {

Назад


(c) ' . $c['title'] . '

- ' . $c['counters'] . ' ' ); } diff --git a/ekr.php b/ekr.php index 7bb9e066..27f81c6a 100644 --- a/ekr.php +++ b/ekr.php @@ -4,6 +4,7 @@ use Core\Config; use Core\Database; use Core\Db; use Model\EkrExchangeRates; +use Validator\Login; if (!defined('GAME_VERSION')) { require_once '_incl_data/autoload.php'; @@ -431,142 +432,39 @@ if (isset($_POST['do']) && $_POST['do'] == 'newShadow') { $day1 = round($day1def + $dc1, 2); $day2 = round($day2def + $dc2, 2); } elseif (isset($_POST['login'])) { - // - function en_ru($txt) - { - $g = false; - $en = preg_match("/^(([0-9a-zA-Z _-])+)$/i", $txt); - $ru = preg_match("/^(([0-9а-яА-Я _-])+)$/i", $txt); - if (($ru && $en) || (!$ru && !$en)) { - $g = true; - } - return $g; - } + $newlogin = (new Login())->setLogin($_POST['login'])->get(); - // - function testBad($txt) - { - $white = '-_ 0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNMїЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮїйцукенгшщзхъфывапролджэячсмитьбю'; - $r = false; - $i = 0; - while ($i != -1) { - if (isset($txt[$i])) { - $g = false; - $j = 0; - while ($j != -1) { - if (isset($white[$j])) { - if ($white[$j] == $txt[$i]) { - $g = true; - } - } else { - $j = -2; - } - $j++; - } - if (!$g) { - $r = true; - } - } else { - $i = -2; - } - $i++; - } - return $r; - } - - function is_login($login) - { - $r = true; - // - $login = htmlspecialchars($login, null); - // - $bad = [ - 'Мусорщик' => 1, - 'Мироздатель' => 1, - ]; - - // - $login_db = mysql_fetch_array( - mysql_query( - 'SELECT `id` FROM `users` WHERE `login` = "' . mysql_real_escape_string($login) . '" LIMIT 1' - ) - ); - if (isset($login_db['id']) || isset($bad[$login])) { - $r = false; - } else { - $true = true; - // - /* - Логин может содержать от 4 до 16 символов, и состоять только из букв русского ИЛИ английского алфавита, цифр, символов '_', '-' и пробела. - Логин не может начинаться или заканчиваться символами '_', '-' или пробелом. - */ - // - $login = str_replace(' ', ' ', $login); - $login = str_replace('%', ' ', $login); - $login = str_replace(' ', ' ', $login); - // - if (strlen($login) > 16) { - $true = false; - } elseif (strlen($login) < 4) { - $true = false; - } elseif (strripos($login, ' ') == true) { - $true = false; - } elseif (substr($login, 1) == ' ' || substr($login, -1) == ' ') { - $true = false; - } elseif (substr($login, 1) == '-' || substr($login, -1) == '-') { - $true = false; - } elseif (substr($login, 1) == '_' || substr($login, -1) == '_') { - $true = false; - } elseif (testBad($login) == true) { - $true = false; - } elseif (en_ru(str_replace('ї', 'е', str_replace('ї', 'Е', $login))) == true) { - $true = false; - } - // - if ($true == false) { - $r = false; - } else { - $r = true; - } - } - return $r; - } - - if ($u->info['login'] == $_POST['login']) { + if (!empty($newlogin) && $u->info['login'] === $newlogin) { $u->error = 'Выберите другой логин...'; } elseif ($u->info['money2'] < 25) { $u->error = 'Недостаточно средств.'; } else { - $login = htmlspecialchars($_POST['login'], null); - if (is_login($login) == true) { - mysql_query( - 'INSERT INTO `lastnames` ( `uid`,`login`,`newlogin`,`time` ) VALUES ( + mysql_query( + 'INSERT INTO `lastnames` ( `uid`,`login`,`newlogin`,`time` ) VALUES ( "' . $u->info['id'] . '","' . $u->info['login'] . '","' . mysql_real_escape_string( - $login - ) . '","' . time() . '" + $newlogin + ) . '","' . time() . '" )' - ); - $u->info['login_last'] = $u->info['login']; - $u->info['login'] = $login; - $u->info['money2'] -= 25; - // - mysql_query( - "UPDATE `items_users` SET `data` = replace( `data` , 'sudba=" . $u->info['login_last'] . "', 'sudba=" . mysql_real_escape_string( - $u->info['login'] - ) . "') WHERE `data` LIKE '%sudba=" . mysql_real_escape_string( - $u->info['login_last'] - ) . "%' AND `uid` = '" . $u->info['id'] . "'" - ); - // - mysql_query( - 'UPDATE `users` SET `login` = "' . mysql_real_escape_string( - $u->info['login'] - ) . '", `money2` = "' . $u->info['money2'] . '" WHERE `id` = "' . $u->info['id'] . '" LIMIT 1' - ); - $u->error = 'Вы успешно сменили логин на "' . $u->info['login'] . '" перезайдите в игру с главной страницы.'; - } else { - $u->error = 'Выберите другой логин...'; - } + ); + $u->info['login_last'] = $u->info['login']; + $u->info['login'] = $newlogin; + $u->addEkr(-25); + + mysql_query( + "UPDATE `items_users` SET `data` = replace( `data` , 'sudba=" . $u->info['login_last'] . "', 'sudba=" . mysql_real_escape_string( + $u->info['login'] + ) . "') WHERE `data` LIKE '%sudba=" . mysql_real_escape_string( + $u->info['login_last'] + ) . "%' AND `uid` = '" . $u->info['id'] . "'" + ); + + mysql_query( + 'UPDATE `users` SET `login` = "' . mysql_real_escape_string( + $u->info['login'] + ) . '" WHERE `id` = "' . $u->info['id'] . '" LIMIT 1' + ); + $u->error = 'Вы успешно сменили логин на "' . $u->info['login'] . '" перезайдите в игру с главной страницы.'; + } } elseif (isset($_GET['buy_ekr'])) { // diff --git a/enter.php b/enter.php index d3c4537b..5214f01a 100644 --- a/enter.php +++ b/enter.php @@ -3,6 +3,8 @@ use Core\Config; use Core\Database; use Core\Db; +use Core\TOTP; +use JetBrains\PhpStorm\NoReturn; use User\Password; use User\UserIp; @@ -15,43 +17,36 @@ require_once __DIR__ . DIRECTORY_SEPARATOR . '_incl_data/autoload.php'; Database::init(); define('IP', UserIp::get()); + $chat = new Chat(); +$login = $_SESSION['login'] ?? ''; +$password = ''; +$otp = ''; -if (isset($_GET['login'])) { - $_POST['login'] = $_GET['login']; - $_POST['pass'] = $_GET['pass']; - $_POST['code'] = $_GET['code']; +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (isset($_POST['login'])) { + $login = $_POST['login']; + } + if (isset($_POST['password'])) { + $password = $_POST['password']; + } + if (isset($_POST['otp'])) { + $otp = $_POST['otp']; + } } -if (isset($_POST['psw'])) { - $_POST['pass'] = $_POST['psw']; -} - -if (isset($_SESSION['login'])) { - $_POST['login'] = $_SESSION['login']; - $_POST['pass'] = $_SESSION['pass']; -} - -function error($e) +#[NoReturn] function error($e): void { - die( - ' - -
-
- Ошибка!! + $returnLink = Config::get('https'); + $html = << +
+
Ошибка!!
+
$e
+
- -
- ' . $e . ' -
- - -
-' - ); + HTML; + exit($html); } $u = Db::getRow( @@ -60,259 +55,154 @@ $u = Db::getRow( users.login, auth, pass, - pass2, - users.city, + totp, users.ip, ipreg, admin, online, banned, - host_reg, - timereg, - securetime, users_delo.text as block_reason from users left join users_delo on users.id = users_delo.uid where users.login = ?', - [$_POST['login']] + [$login] ); -$auth = Db::getValue('select id from logs_auth where uid = ? and ip = ?', [$u['id'], IP]); -if (!isset($u['id'])) { - error('Логин "' . $_POST['login'] . '" не найден в базе.'); -} elseif ($u['banned'] > 0) { - $blockstr = "Персонаж {$u['login']} заблокирован."; - $blockstr .= $u['block_reason'] ? "Причина блокировки: {$u['block_reason']}

" : '

'; - error($blockstr); -} elseif (!Password::isGood($_POST['pass'], $u['pass'], $u['login'])) { - error("Неверный пароль к персонажу {$u['login']}."); - Db::sql( - 'insert into logs_auth (uid, ip, browser, type, time) values (?,?,?,3,unix_timestamp())', - [$u['id'], IP, $_SERVER['HTTP_USER_AGENT']] - ); -} else { - - //Второй пароль - if (!empty($u['pass2'])) { - $_SESSION['login'] = $_POST['login']; - $_SESSION['pass'] = $_POST['pass']; - $good2 = false; - $koko = ''; - if (password_verify($_POST['code'], $u['pass2'])) { - $good2 = true; - unset($_SESSION['login'], $_SESSION['pass']); - } else { - if (isset($_POST['code'])) { - $koko = 'Неверный второй пароль
'; - } - setcookie('login', '', time() - 60 * 60 * 24, '', Config::get('host')); - } - - if ($koko) { - $koko = '' . $koko . ''; - } - if (!$good2) { - ?> - - - - - - - Второй пароль - - -

Запрос второго пароля к персонажу.

- -
-
-
- - pass -
-
- p1 - p2 - p3 -
- p4 - p5 - p6 -
- p7 - p8 - p9 -
- back - nan - ok -
-
- - - - - 0) { + $blockstr = "Персонаж {$u['login']} заблокирован."; + $blockstr .= $u['block_reason'] ? "Причина блокировки: {$u['block_reason']}

" : '

'; + error($blockstr); + } elseif (!Password::isGood($password, $u['pass'], $u['login'])) { Db::sql( - 'insert into logs_auth (uid, ip, browser, type, time) VALUES (?,?,?,1,unix_timestamp())', - [$u['id'], $_COOKIE['ip'], $_SERVER['HTTP_USER_AGENT']] + 'insert into logs_auth (uid, ip, browser, type, time) values (?,?,?,3,unix_timestamp())', + [$u['id'], IP, $_SERVER['HTTP_USER_AGENT']] ); + error("Неверный пароль к персонажу {$u['login']}."); } - setcookie('login', $_POST['login'] ?? '', time() + 60 * 60 * 24 * 7, '', Config::get('host')); - setcookie('ip', IP, time() + 60 * 60 * 24 * 150, ''); - - if ($u['online'] < time() - 520) { - $sp = Db::getRows('select room, city, login from users where online > unix_timestamp() - 600 and id in (select user from friends where friend = ?)', [$u['id']]); - foreach ($sp as $usr) { - $chatDto = new ChatMessage(); - $chatDto->setRoom($usr['room']); - $chatDto->setCity($usr['city']); - $chatDto->setTo($usr['login']); - $chatDto->setText('Вас приветствует: ' . $u['login'] . '.'); - $chatDto->setType(6); - $chat->sendMsg($chatDto); - } + $_SESSION['login'] = $u['login']; + if (!empty($u['totp'])) { + $_SESSION['totp'] = new TOTP($u['totp']); } - - $apu = ''; - Db::sql('update dump set ver = 1, upd = 2 where uid = ?', [$u['id']]); - - if ( - $u['auth'] != md5($u['login'] . 'AUTH' . IP) || - $_COOKIE['auth'] != md5($u['login'] . 'AUTH' . IP) || - $u['auth'] == '' || $u['auth'] == '0' - ) { - if ( - $u['auth'] != '' && - $u['auth'] != '0' && - $u['ip'] != IP - ) { - $cmsg = new ChatMessage(); - $cmsg->setTo($u['login']); - $cmsg->setText('В предыдущий раз этим персонажем заходили с другого компьютера ' . date('d.m.Y H:i', $u['online']) . "(Предыдущий ip: %{$u['ip']})"); - $cmsg->setType(6); - $chat->sendMsg($cmsg); - } - $apu = "auth = '" . md5($u['login'] . 'AUTH' . IP) . "',"; - setcookie('auth', md5($u['login'] . 'AUTH' . IP), time() + 60 * 60 * 24 * 365, '', Config::get('host')); - } - - $ipnew = IP; - - Db::sql('insert into logs_auth (uid, ip, browser, time) values (?,?,?,unix_timestamp())', [ - $u['id'], IP, $_SERVER['HTTP_USER_AGENT'], - ]); - - Db::sql("update users set $apu ip = ?, dateEnter = ?, online = unix_timestamp() where id = ?", [$ipnew, $_SERVER['HTTP_USER_AGENT'], $u['id']]); - - $_SESSION['uid'] = $u['id']; - header('location: /bk'); - exit(); } + +if (!empty($_SESSION['totp']) && !empty($_SESSION['login'])) { + if (empty($otp)) { + ?> + + + + Второй пароль + + +
+
+
+ +
+ + + generate() !== $otp) { + unset($_SESSION['login'], $_SESSION['totp']); + error('Неверный одноразовый код!'); + } +} + +if (!Db::getValue('select count(*) from stats where id = ?', [$u['id']])) { + Db::sql('insert into stats (id, stats) values (?,?)', [$u['id'], 's1=3|s2=3|s3=3|s4=3|rinv=40|m9=5|m6=10']); +} +if (!Db::getValue('select count(*) from online where uid = ?', [$u['id']])) { + Db::sql('insert into online (uid, timeStart) values (?,unix_timestamp())', [$u['id']]); +} + +if (isset($_COOKIE['login'])) { + setcookie('login', '', time() - 60 * 60 * 24, '', Config::get('host')); +} + +//мульты +if ($u['admin'] === 0) { + $ipm1 = Db::getValue( + 'select ip from logs_auth where uid = ? and ip != ? order by id limit 1', + [$u['id'], $u['ip']] + ); + $ppl = Db::getRows( + 'select * from logs_auth where ip != ? and (ip = ? or ip = ? or ip = ? or ip = ? or ip = ?)', + ['', $u['ip'], $ipm1, $u['ipreg'], IP, $_COOKIE['ip']] + ); + foreach ($ppl as $item) { + $ml = Db::getValue( + 'select id from mults where (uid = ? and uid2 = ?) or (uid = ? and uid2 = ?) limit 1', + [$item['uid'], $u['id'], $u['id'], $item['uid']] + ); + if (!$ml && $item['ip'] !== '' && $item['ip'] !== '127.0.0.1') { + Db::sql('insert into mults (uid, uid2, ip) VALUES (?,?,?)', [$u['id'], $item['uid'], $item['ip']]); + } + } +} + +if (isset($_COOKIE['ip']) && $_COOKIE['ip'] != IP) { + Db::sql( + 'insert into logs_auth (uid, ip, browser, type, time) VALUES (?,?,?,1,unix_timestamp())', + [$u['id'], $_COOKIE['ip'], $_SERVER['HTTP_USER_AGENT']] + ); +} + +setcookie('login', $_POST['login'] ?? '', time() + 60 * 60 * 24 * 7, '', Config::get('host')); +setcookie('ip', IP, time() + 60 * 60 * 24 * 150, ''); + +if ($u['online'] < time() - 520) { + $sp = Db::getRows('select room, login from users where online > unix_timestamp() - 600 and id in (select user from friends where friend = ?)', [$u['id']]); + foreach ($sp as $usr) { + $chatDto = new ChatMessage(); + $chatDto->setRoom($usr['room']); + $chatDto->setTo($usr['login']); + $chatDto->setText('Вас приветствует: ' . $u['login'] . '.'); + $chatDto->setType(6); + $chat->sendMsg($chatDto); + } +} + +$apu = ''; +Db::sql('update dump set ver = 1, upd = 2 where uid = ?', [$u['id']]); + +if ( + $u['auth'] != md5($u['login'] . 'AUTH' . IP) || + $_COOKIE['auth'] != md5($u['login'] . 'AUTH' . IP) || + $u['auth'] == '' || $u['auth'] == '0' +) { + if ( + $u['auth'] != '' && + $u['auth'] != '0' && + $u['ip'] != IP + ) { + $cmsg = new ChatMessage(); + $cmsg->setTo($u['login']); + $cmsg->setText('В предыдущий раз этим персонажем заходили с другого компьютера ' . date('d.m.Y H:i', $u['online']) . "(Предыдущий ip: %{$u['ip']})"); + $cmsg->setType(6); + $chat->sendMsg($cmsg); + } + $apu = "auth = '" . md5($u['login'] . 'AUTH' . IP) . "',"; + setcookie('auth', md5($u['login'] . 'AUTH' . IP), time() + 60 * 60 * 24 * 365, '', Config::get('host')); +} + +$ipnew = IP; + +Db::sql('insert into logs_auth (uid, ip, browser, time) values (?,?,?,unix_timestamp())', [ + $u['id'], IP, $_SERVER['HTTP_USER_AGENT'], +]); + +Db::sql("update users set $apu ip = ?, dateEnter = ?, online = unix_timestamp() where id = ?", [$ipnew, $_SERVER['HTTP_USER_AGENT'], $u['id']]); + +$_SESSION['uid'] = $u['id']; + +unset($_SESSION['login'], $_SESSION['totp']); + +header('location: /bk'); +exit(); diff --git a/forum_script/index.php b/forum_script/index.php index 065b8c65..cf88fa86 100644 --- a/forum_script/index.php +++ b/forum_script/index.php @@ -1179,13 +1179,9 @@ function MM_jumpMenu(targ, selObj, restore) { //v3.0 ', { + 'a1': 'bgsanSend()', + 'usewin': '$(\'#bgsaninp\').focus()', + 'd': '
Ответ Вы получите по телеграфу в течении 24 часов после отправки.
' + }, 3, 1, 'min-width:500px;'); + CKEDITOR.replace('bgsaninp', { + uiColor: '#b1a993', + toolbar: [ + ['Bold', 'Italic', 'Underline', 'RemoveFormat', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink'], + ['FontSize', 'TextColor', 'BGColor', 'Image', 'SpecialChar', 'Maximize'], + ['UIColor'] + ] + + }); +} + +//Телеграф +function tgf_send() { + //tgf_to , tgf_tema + if ($('#tgf_to').val() == '' || $('#tgf_text').val() == '' || $('#tgf_title').val() == '' || $('#tgf_to').val() == ' ' || $('#tgf_text').val() == ' ' || $('#tgf_title').val() == ' ') { + $('#trf_snd_error').html('Все поля должны быть заполнены!'); + } else { + top.tgf_lln = 0; + top.tgf_txt = 'Отправка сообщения к ' + $('#tgf_to').val() + ''; + top.tgf_loading(1); + $.post('telegraf.php', { + 'r': 3, + 'to': $('#tgf_to').val(), + 'tema': $('#tgf_tema').val(), + 'text': $('#tgf_text').val() + }, function (data) { + top.tgf_see(data) + }); + } +} + +function telegraf(t) +// +{ + top.tgf_lln = 0; + top.tgf_tmr = null; + top.tgf_txt = ''; + var tg = ''; + tg += '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + + '' + + '' + + '' + + '' + + '' + + '
 Входящие  Отправленные  Написать 
 
 
' + + '
'; + + win.add('telegraf1', 'Ваши сообщения  ', tg, { + 'usewin': '', + 'd': '
Служба обмена сообщениями между персонажами
' + }, 0, 1, 'min-width:500px;height:350px;'); + top.tgf_ico(0); + top.tgf_rz(1); +} + +var tgf_mo = 0; + +function tgf_openMsg(id) { + top.tgf_lln = 0; + top.tgf_txt = 'Открываем сообщение №' + id; + top.tgf_loading(1); + top.tgf_mo = id; + $('#tgfmsgdiv').css({'display': '', 'background-color': '#ebe4d0', 'width': '498px', 'height': '305'}); + $.post('telegraf.php', {'see_msg': id}, function (data) { + $('#tgfmsgdiv').html(data); + }); +} + +function tgf_closeMsg() { + if (top.tgf_mo != 0) { + $('#tgfm' + top.tgf_mo).attr({'className': 'tgf_msg1'}); + } + $('#tgfmsgdiv').css({'display': 'none'}); + $('#tgfmsgdiv').html(''); +} + +var tgf_status = 0; + +function tgf_ico(id) { + if (id == 1) { + $('#tgf_icon').css({'display': ''}); + } else if (id == 0) { + $('#tgf_icon').css({'display': 'none'}); + } + tgf_status = id; +} + +function tgf_rz(id, pg, re) { + if (pg == null) { + pg = 1; + } + if (re == null) { + re = 0; + } + top.tgf_lln = 0; + top.tgf_txt = 'Загрузка данных по разделу'; + top.tgf_loading(1); + $('#tgf_rz1').attr({'className': 'tf_btn1'}); + $('#tgf_rz2').attr({'className': 'tf_btn1'}); + $('#tgf_rz3').attr({'className': 'tf_btn1'}); + $('#tgf_rz' + id).attr({'className': 'tf_btn11'}); + $.post('telegraf.php', {'r': id, 'p': pg, 're': re}, function (data) { + top.tgf_see(data) + }); +} + +function del_tgf(id, pg, idmsg) { + top.tgf_ico(0); + if (pg == null) { + pg = 1; + } + top.tgf_lln = 0; + top.tgf_txt = 'Удаление сообщения №' + idmsg; + top.tgf_loading(1); + $.post('telegraf.php', {'r': id, 'p': pg, 'del_msg': idmsg}, function (data) { + top.tgf_see(data) + }); +} + +function tgf_see(data) { + $('#tgf_div').html(data); + top.tgf_closeMsg(); +} + +function qn_win_cls() { + $('#qsst').html(''); + $('#qsst').css('display', 'none'); +} + +var qst_sml = false; + +function qn_slk(obr) { + if (top.qst_sml != '') { + + $('#qsst').fadeIn('fast'); + $('#mini_qsst').fadeOut('fast'); + $('#mini_qsst').html(''); + top.qst_sml = ''; + + } else { + + $('#mini_qsst').html(''); + $('#qsst').fadeOut('fast'); + $('#mini_qsst').fadeIn('fast'); + top.qst_sml = obr; + + } +} + +function qn_win(t, obr) { + $('#qsst').html( + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + + '
 ' + + '' + + '
' + t + '
' + + '' + + '
 
' + ); + if (top.qst_sml == '') { + $('#qsst').css('display', 'block'); + } else { + if (top.qst_sml != obr) { + $('#mini_qsst').html(''); + } + } + $('#qsst').center(); +} + +//загрузка +var tgf_lln = 0, + tgf_tmr, tgf_txt = ''; + +function tgf_loading(id) { + clearTimeout(top.tgf_tmr); + if (id == 1) { + //начинаем + top.tgf_lln += 5; + var prc = Math.floor(top.tgf_lln / 10000 * 500); + if (prc < 0) { + prc = 0; + } else if (prc > 500) { + prc = 500; + } + if (prc == 500) { + alert('Не удалось отправить\получить запрос.'); + } + } else { + //завершаем + top.tgf_lln += 275; + var prc = Math.floor(top.tgf_lln / 10000 * 500); + } + if (prc < 0) { + prc = 0; + } else if (prc > 500) { + prc = 500; + } + $('#tgf_loadingLine').css({'width': prc + 'px'}); + $('#tgf_loadingLine').html('
    ' + top.tgf_txt + '
'); + if (top.tgf_lln < 10000) { + top.tgf_tmr = setTimeout('top.tgf_loading(' + id + ')', 10); + $('#tgf_loadingLine').css({'background': '#9c9174'}); + } else { + $('#tgf_loadingLine').html(' '); + $('#tgf_loadingLine').css({'background': '#ddd5bf'}); + clearTimeout(top.tgf_tmr); + } +} + +function bgsanSend() { + top.datas = CKEDITOR.instances.bgsaninp.getData(); + $.post('bag.php', {'text': datas, 'type': $('#bgsantp').val(), 'type2': $('#bgsantp2').val()}, function (data) { + top.bgsanSendReturn(data); + }); +} + +function bgsanSendReturn(data) { + if (data == 1) { + //все отлично + alert('Ваше сообщение успешно оправлено!'); + top.datas = ''; + } else { + //ошибка отправки + if (data == -1) { + alert('Перезайдите на персонажа с главной'); + top.datas = ''; + top.location = "http://likebk.com/"; + } else if (data == -2) { + alert('Нельзя отправлять пустое сообщение'); + } else if (data == -3) { + alert('Выберите корректный тип сообщения'); + } else if (data == -4) { + alert('IP не соответствует действительному'); + } else { + alert(' Сообщение не удалось отправить ' + data); + } + + if (data != -1) { + top.bagsandpartners(true); + } + } +} + + +/* + * Adjust the behavior of the dataProcessor to avoid styles + * and make it look like FCKeditor HTML output. + */ +function configureHtmlOutput(ev) { + var editor = ev.editor, + dataProcessor = editor.dataProcessor, + htmlFilter = dataProcessor && dataProcessor.htmlFilter; + + // Out self closing tags the HTML4 way, like
. + dataProcessor.writer.selfClosingEnd = '>'; + + // Make output formatting behave similar to FCKeditor + var dtd = CKEDITOR.dtd; + for (var e in CKEDITOR.tools.extend({}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent)) { + dataProcessor.writer.setRules(e, { + indent: true, + breakBeforeOpen: true, + breakAfterOpen: false, + breakBeforeClose: !dtd[e]['#'], + breakAfterClose: true + }); + } + + // Output properties as attributes, not styles. + htmlFilter.addRules({ + elements: { + $: function (element) { + // Output dimensions of images as width and height + if (element.name == 'img') { + var style = element.attributes.style; + + if (style) { + // Get the width from the style. + var match = (/(?:^|\s)width\s*:\s*(\d+)px/i).exec(style), + width = match && match[1]; + + // Get the height from the style. + match = (/(?:^|\s)height\s*:\s*(\d+)px/i).exec(style); + var height = match && match[1]; + + if (width) { + element.attributes.style = element.attributes.style.replace(/(?:^|\s)width\s*:\s*(\d+)px;?/i, ''); + element.attributes.width = width; + } + + if (height) { + element.attributes.style = element.attributes.style.replace(/(?:^|\s)height\s*:\s*(\d+)px;?/i, ''); + element.attributes.height = height; + } + } + } + + // Output alignment of paragraphs using align + if (element.name == 'p') { + style = element.attributes.style; + + if (style) { + // Get the align from the style. + match = (/(?:^|\s)text-align\s*:\s*(\w*);/i).exec(style); + var align = match && match[1]; + + if (align) { + element.attributes.style = element.attributes.style.replace(/(?:^|\s)text-align\s*:\s*(\w*);?/i, ''); + element.attributes.align = align; + } + } + } + + if (!element.attributes.style) + delete element.attributes.style; + + return element; + } + }, + + attributes: { + style: function (value, element) { + // Return #RGB for background and border colors + return CKEDITOR.tools.convertRgbToHex(value); + } + } + }); +} + + +function centerObj(obj) { + $(obj).center(); +} + +//Квестовое выделение +var quest = { + clear: false, + sel: function (el) { + var p = $(el); + var offset = p.offset(); + $('#qel0').css({ + 'display': '', + 'borderColor': '#F30', + 'top': (offset.top - 1) + 'px', + 'left': (offset.left - 2) + 'px', + 'width': '' + (parseInt($(el).css('width')) - 4) + 'px', + 'height': '' + (parseInt($(el).css('height')) - 6) + 'px' + }); + $('#qel0').html('
'); + hi(el, 'Инвентарь персонажа', { + 'pageX': (parseInt($(el).css('width')) - 4), + 'pageY': (parseInt($(el).css('height')) - 6) + }, 3, 1, 1, 1, ''); + this.selAnim(el, 1); + this.selAnim2(el, 1); + //$(el).css({'border-color':'red','border-style':'solid','border-width':'2px'}); + }, + selAnim: function (el, type) { + if (this.clear == false) { + if ($('#qel0').is(':hover') || $(el).is(':hover')) { + if (type == 1) { + $('#qel0').fadeOut(0, null, function () { + quest.selAnim(el, 2); + }); + } else { + $('#qel0').fadeOut(0, null, function () { + quest.selAnim(el, 1); + }); + } + } else { + var p = $(el); + var offset = p.offset(); + $('#qel0').css({ + 'top': (offset.top - 1) + 'px', + 'left': (offset.left - 2) + 'px', + 'width': '' + (parseInt($(el).css('width')) - 4) + 'px', + 'height': '' + (parseInt($(el).css('height')) - 6) + 'px', + + 'padding-top': parseInt($(el).css('padding-top')) + 'px', + 'padding-left': parseInt($(el).css('padding-left')) + 'px', + 'padding-right': parseInt($(el).css('padding-right')) + 'px', + 'padding-bottom': parseInt($(el).css('padding-bottom')) + 'px' + }); + if (type == 1) { + $('#qel0').fadeOut('slow', null, function () { + quest.selAnim(el, 2); + }); + } else { + $('#qel0').fadeIn('fast', null, function () { + quest.selAnim(el, 1); + }); + } + } + } else { + $('#qel0').css({ + 'display': 'none', + 'borderColor': '', + 'top': '0px', + 'left': '0px', + 'width': '1px', + 'height': '1px' + }); + $('#qel0').html(''); + this.clear = false; + } + }, + selAnim2: function (el, type) { + if (this.clear == false) { + if ($('#qel0').is(':hover') || $(el).is(':hover')) { + if (type == 1) { + $('#qel0st').animate({'top': '+=10px'}, 'slow', null, function () { + quest.selAnim2(el, 2); + }); + } else { + $('#qel0st').animate({'top': '-=10px'}, 'slow', null, function () { + quest.selAnim2(el, 1); + }); + } + } else { + if (type == 1) { + $('#qel0st').animate({'top': '+=10px'}, 'slow', null, function () { + quest.selAnim2(el, 2); + }); + } else { + $('#qel0st').animate({'top': '-=10px'}, 'slow', null, function () { + quest.selAnim2(el, 1); + }); + } + } + } + } +}; + +/* Поединки */ +var bcl = Array(); +var bclLast = Array(); +var id_log_ar = Array(); +bcl[1] = 0; +bcl[2] = 1; +bcl[3] = 0; +bcl[4] = 0; + +function goSit(dd) { + if (top.frames['main'] != undefined) { + if (top.frames['main'].document.getElementById('auto_battle') != undefined) { + top.frames['main'].document.getElementById('auto_battle').value = bcl[3]; + } + if (top.frames['main'].document.getElementById('save_zones') != undefined) { + top.frames['main'].document.getElementById('save_zones').value = bcl[4]; + } + if (top.frames['main'].document.getElementById('fast_battle') != undefined) { + top.frames['main'].document.getElementById('fast_battle').value = bcl[1]; + } + } +} + +function btlclearlog() { + $('#battle_logg').html(''); +} + +function r_page(a) { + top.frames['main'].location.reload(); +} + +var key_actions = ['', '', 1]; +$(document).ready(function () { + $('#globalMain').click(function () { + top.win.addaction(2, 0); + }); + $(document).keypress(function (e) { + if (top.key_actions[2] == 1) { + if (e.keyCode == 13 && top.key_actions[0] != '') { + //нажата клавиша enter + eval(top.key_actions[0]); + } + } + }); +}); + +$(document).ready(function () { // зaпускaем скрипт пoсле зaгрузки всех элементoв + /* зaсунем срaзу все элементы в переменные, чтoбы скрипту не прихoдилoсь их кaждый рaз искaть при кликaх */ + var overlay = $('#overlay'); // пoдлoжкa, дoлжнa быть oднa нa стрaнице + var open_modal = $('.open_modal'); // все ссылки, кoтoрые будут oткрывaть oкнa + var close = $('.modal_close, #overlay'); // все, чтo зaкрывaет мoдaльнoе oкнo, т.е. крестик и oверлэй-пoдлoжкa + var modal = $('.modal_div'); // все скрытые мoдaльные oкнa + + open_modal.click(function (event) { // лoвим клик пo ссылке с клaссoм open_modal + event.preventDefault(); // вырубaем стaндaртнoе пoведение + var div = $(this).attr('href'); // вoзьмем стрoку с селектoрoм у кликнутoй ссылки + overlay.fadeIn(400, //пoкaзывaем oверлэй + function () { // пoсле oкoнчaния пoкaзывaния oверлэя + $(div) // берем стрoку с селектoрoм и делaем из нее jquery oбъект + .css('display', 'block') + .animate({opacity: 1, top: '50%'}, 200); // плaвнo пoкaзывaем + }); + }); + + close.click(function () { // лoвим клик пo крестику или oверлэю + modal // все мoдaльные oкнa + .animate({opacity: 0, top: '45%'}, 200, // плaвнo прячем + function () { // пoсле этoгo + $(this).css('display', 'none'); + overlay.fadeOut(400); // прячем пoдлoжку + } + ); + }); +}); + + +//c_log start +/* +function mobileAndTabletCheck() { + var check = false; + (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); + return check; +}; + +function getPosition(e){ + var x = y = 0; + if (!e) { + var e = window.event; + } + if (e.pageX || e.pageY){ + x = e.pageX; + y = e.pageY; + } else if (e.clientX || e.clientY){ + x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; + y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; + } + return {x: x, y: y} +} +*/ + +function c_log() { + /* + var stopLog = false; + var lastX = 0; + var lastY = 0; + var mouseDownX = 0; + var mouseDownY = 0; + var isClearClick = 0; + + + $("iframe#main").contents().find("body").mousemove(function(e){ + var coord = getPosition(e); + lastX = coord.x; + lastY = coord.y; + }); + + $("iframe#main").contents().find("body").mousedown(function(e){ + var coord = getPosition(e); + mouseDownX = coord.x; + mouseDownY = coord.y; + }); + $("iframe#main").contents().find("body").mouseup(function(e){ + var coord = getPosition(e); + if ( mouseDownX === coord.x || mouseDownY === coord.y ) { + isClearClick = 1; + } + }); + + $("iframe#main").contents().bind("keydown", function(e){ + if ( e.keyCode == 13 ) { + stopLog = true; + } + setTimeout(function(){ + stopLog = false; + }, 5000); + }); + + $("iframe#main").contents().bind("click", function(e){ + if (!stopLog) { + + var coord = getPosition(e); + var isCheckCoordClidk = false; + if ( (lastX !== coord.x || lastY !== coord.y) && mobileAndTabletCheck === false && isClearClick === 1 ) { + isCheckCoordClidk = true; + } + if ( (coord.x === 0 && coord.y === 0) || isCheckCoordClidk === true ) { + var time = Math.round(new Date().getTime() / 1000); + + if ( $.cookie('c_log') === null ) { + $.cookie('c_log', time); + return false; + } + if ( time - $.cookie('c_log') >=5 ) { + $.cookie('c_log', time); + $.ajax({ + url: 'c_log.php', + type: "POST", + }); + } + } + } + }); + */ +} + +//c_log end + + + + diff --git a/js/gameEngine.js b/js/gameEngine.js index 1b81e5f4..8700b71d 100644 --- a/js/gameEngine.js +++ b/js/gameEngine.js @@ -235,8 +235,6 @@ function add_cb(id, name, main, indata = '') { cb_date[cb_id] = id; cb_rdate[id] = cb_id; - console.log(cb_ndate, name, cb_ndate['Системные сообщения'], cb_ndate['Чат']); - if (cb_ndate[name] !== undefined) { let j = 1, name2 = ''; @@ -950,7 +948,7 @@ function useMagicBattle(name, id, img, type, type_use, text, team) { // 4.26 function useMagicGoGoBattle(id) { - top.frames['main'].useitem(id, 1, $(`#useMagicLoginBtl${id}`).val()); + top.frames['main'].useitem(id, $(`#useMagicLoginBtl${id}`).val()); } /* Использовать предмет на */ @@ -1018,7 +1016,7 @@ function priemOnUser(pr, id, nm, onInUser, img) { win.add(`iusepr${pr}`, `Используем "${nm}"  `, '
Укажите логин персонажа:
(можно щелкнуть по логину в чате)
', { 'a1': `usePriemNow(\'${pr}\');`, 'usewin': `chat.inObj = $(\'#usePriemLogin${pr}\');$(\'#usePriemLogin${pr}\').focus()`, - 'd': `
` + 'd': `
` }, 3, styleWin, 'min-width:300px;'); chat.inObj = $(`#usePriemLogin${pr}`); @@ -1028,7 +1026,7 @@ function priemOnUser(pr, id, nm, onInUser, img) { // 4.32 function usePriemNow(id) { top.frames['main'].use_on_pers = $(`#usePriemLogin${id}`).val(); - top.frames['main'].usepriem(id, 1, ''); + top.frames['main'].usepriem(id); } var datas = ''; diff --git a/jx/battle/refresh.php b/jx/battle/refresh.php index f8379bc9..49eccb00 100644 --- a/jx/battle/refresh.php +++ b/jx/battle/refresh.php @@ -233,18 +233,18 @@ if (!$isBattle) { '; - + echo ''; } diff --git a/jx/battle/refresh1.php b/jx/battle/refresh1.php index 368e1c2c..ec4e84b5 100644 --- a/jx/battle/refresh1.php +++ b/jx/battle/refresh1.php @@ -252,5 +252,5 @@ if (!$isBattle) { unset($atk1); } - echo ''; + echo ''; } diff --git a/jx/battle/refresh2.php b/jx/battle/refresh2.php index 4152a5e6..b0de8f01 100644 --- a/jx/battle/refresh2.php +++ b/jx/battle/refresh2.php @@ -255,6 +255,6 @@ if (isset($_POST['atack'], $_POST['block']) || (isset($_POST['id']) && $_POST['i unset($atk1); } - echo ''; + echo ''; } } diff --git a/jx/battle/refresh_bot.php b/jx/battle/refresh_bot.php index 319541e3..8c957368 100644 --- a/jx/battle/refresh_bot.php +++ b/jx/battle/refresh_bot.php @@ -62,7 +62,7 @@ if (isset($CRON_CORE) && (isset($_POST['atack'], $_POST['block']) || (isset($_PO if (!isset($CRON_CORE)) { require_once('../../_incl_data/__config.php'); if ($_SESSION['tbr'] > $tm) { - die(''); + die(''); } else { $_SESSION['tbr'] = $tm + 0.350; } diff --git a/main.php b/main.php index a2d47d37..2b4f03ab 100644 --- a/main.php +++ b/main.php @@ -4,6 +4,7 @@ if (!defined('GAME_VERSION')) { } use Core\{Config, Database, Db}; +use Model\ActionModel; use User\ItemsModel; use User\UserIp; @@ -43,9 +44,9 @@ if ($u->info['bithday'] == '01.01.1800' && $u->info['inTurnirnew'] == 0) { } #--------для общаги, и позже для почты -$sleep = $u->testAction('`vars` = "sleep" AND `uid` = "' . $u->info['id'] . '" LIMIT 1', 1); +$sleep = ActionModel::getOne(["uid = {$u->info['id']}", 'vars = sleep'], 'id'); 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']]); + Db::sql('update actions set vars = ? where id = ?', ['unsleep', $sleep]); } if ($u->room['file'] == "room_hostel" || $u->room['file'] == "post") { $trololo = 0; @@ -255,7 +256,7 @@ if ($magic->youuse > 0) { if ($act != -2) { $u->stats = $u->getStats($u->info['id'], 0, 1); $u->aves = ItemsModel::inventoryWeightAndItemQuantity(); - if (!isset($sleep['id'])) { + if (empty($sleep)) { $act2 = $u->testItems($u->info['id'], $u->stats, 0); } if ($act2 != -2 && $act == -2) { @@ -413,7 +414,7 @@ if (isset($btl_last['id']) && $u->info['battle'] == 0) { $u->info['battle_lsto'] = true; } elseif ($u->info['battle'] == 0) { //Проверка/Снятие предметов - if (!isset($sleep['id'])) { + if (empty($sleep)) { $act2 = $u->testItems($u->info['id'], $u->stats, 0); } if ($act2 != -2 && $act == -2) { @@ -528,7 +529,7 @@ if (isset($_GET['security']) && !isset($u->tfer['id']) && $trololo == 1) { } 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' + 'level_transfer' ) && $trololo == 1 && $u->info['inTurnir'] == 0 && $u->info['inTurnirnew'] == 0) { if ($u->info['allLock'] > time()) { require_once('modules_data/_locations.php'); diff --git a/main_bot.php b/main_bot.php index 26c32a84..93a5c4dd 100644 --- a/main_bot.php +++ b/main_bot.php @@ -1,7 +1,9 @@ testAction('`vars` = "sleep" AND `uid` = "' . $u->info['id'] . '" LIMIT 1', 1); -if ($u->room['file'] != "objaga" && $sleep['id'] > 0) { - mysql_query('UPDATE `actions` SET `vars` = "unsleep" WHERE `id` = ' . $sleep['id']); +$sleep = ActionModel::getOne(["uid = {$u->info['id']}", 'vars = sleep'], 'id'); +if ($u->room['file'] != "objaga" && $sleep > 0) { + mysql_query('UPDATE `actions` SET `vars` = "unsleep" WHERE `id` = ' . $sleep); } $trololo = $u->room['file'] == "objaga" || $u->room['file'] == "post" ? 0 : 1; @@ -79,7 +81,7 @@ if ($u->info['online'] < time() - 60) { } if (!isset($u->info['id']) || ($u->info['joinIP'] == 1 && $u->info['ip'] != $_SERVER['HTTP_X_REAL_IP']) || $u->info['banned'] > 0) { - die($c['exit']); + die(Config::get('exit')); } if (isset($_GET['atak_user']) && $u->info['battle'] == 0 && $_GET['atak_user'] != $u->info['id']) { @@ -110,7 +112,6 @@ if (isset($_GET['atak_user']) && $u->info['battle'] == 0 && $_GET['atak_user'] ! $rtxt = '[img[items/pal_button8.gif]] "' . $u->info['login'] . '" совершил' . $sx . ' нападение по метке на персонажа "' . $ua['login'] . '".'; $cmsg = new ChatMessage(); - $cmsg->setCity($u->info['city']); $cmsg->setRoom($u->info['room']); $cmsg->setText($rtxt); $cmsg->setType(6); @@ -168,75 +169,9 @@ if ($ul == 1) { $act = 1; } -//// Непонятно что это, потому что переменной 'repass' не существует и этот код никогда не выполняется. 15.08.2023, Инс. -//if ($u->info['repass'] > 0 && $u->info['id'] != 5433446) { -// -// /*-----------------------*/ -// if ($u->info['battle'] == 0) { -// if ($act2 != -2 && $act == -2) { -// $act = $act2; -// } -// -// if (!isset($u->tfer['id']) && $u->room['block_all'] == 0) { -// //Одеть/снять предмет -// if (isset($_GET['rstv']) && isset($_GET['inv'])) { -// $act = $u->freeStatsMod($_GET['rstv'], $_GET['mf'], $u->info['id']); -// } elseif (isset($_GET['ufs2']) && isset($_GET['inv'])) { -// $act = $u->freeStats2Item($_GET['itmid'], $_GET['ufs2'], $u->info['id'], 1); -// } elseif (isset($_GET['ufs2mf']) && isset($_GET['inv'])) { -// $act = $u->freeStats2Item($_GET['itmid'], $_GET['ufs2mf'], $u->info['id'], 2); -// } elseif (isset($_GET['ufsmst']) && isset($_GET['inv'])) { -// $act = $u->itemsSmSave($_GET['itmid'], $_GET['ufsmst'], $u->info['id']); -// } elseif (isset($_GET['ufsms']) && isset($_GET['inv'])) { -// $act = $u->itemsSmSave($_GET['itmid'], $_GET['ufsms'] + 100, $u->info['id']); -// } elseif (isset($_GET['ufs']) && isset($_GET['inv'])) { -// $act = $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'])) { -// $act = $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'])) { -// $u->deleteItem(intval($_GET['delete']), $u->info['id']); -// } elseif (isset($_GET['stack']) && isset($_GET['inv'])) { -// $u->stack($_GET['stack']); -// } elseif (isset($_GET['unstack']) && isset($_GET['inv'])) { -// $u->unstack($_GET['unstack']); -// } 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']); -// } -// } -// -// } elseif ($u->info['battle_text'] != '') { -// Db::sql('update stats set battle_text = ?, last_b = 0 where id = ?', ['', $u->info['id']]); -// } -// -// if ($magic->youuse > 0) { -// $act = 1; -// } -// //Получение статов -// if ($act != -2) { -// $u->stats = $u->getStats($u->info['id'], 0, 1); -// $u->aves = \User\ItemsModel::inventoryWeightAndItemQuantity(); -// $act2 = $u->testItems($u->info['id'], $u->stats, 0); -// if ($act2 != -2 && $act == -2) { -// $act = $act2; -// } -// } -//} - if ( (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'])) { include('modules_data/_zv.php'); } - -mysql_query('UNLOCK TABLES'); diff --git a/modules_data/_animal.php b/modules_data/_animal.php index 16fc138c..755a7a2e 100644 --- a/modules_data/_animal.php +++ b/modules_data/_animal.php @@ -1,4 +1,8 @@ var elem = document.getElementById('se-pre-con'); @@ -19,39 +23,19 @@ if (!isset($an['id'])) { mysql_query('UPDATE `users` SET `animal` = "0" WHERE `id` = "' . $u->info['id'] . '" LIMIT 1'); mysql_query('UPDATE `users_animal` SET `delete` = "' . time() . '" WHERE `uid` = "' . $u->info['id'] . '" AND `id` = "' . $an['id'] . '" AND `delete` = "0" LIMIT 1'); } elseif (isset($_GET['anml_login']) && $an['renameArrayKeys'] == 0) { - $n = 1; - function en_ru($txt) - { - $g = false; - $en = preg_match("/^(([a-zA-Z _-])+)$/i", $txt); - $ru = preg_match("/^(([а-яА-Я _-])+)$/i", $txt); - if (($ru && $en) || (!$ru && !$en)) { - $g = true; - } - return $g; - } - $nl = htmlspecialchars($_GET['anml_login'], null); - $nl = str_replace(' ', '', $nl); - $nl = str_replace(' ', '', $nl); - $sr = "!@#$%^&*()\+Ёё|/'`\"-_"; - if ($nl == '' || strlen($nl) > 10 || strlen($nl) < 2 || en_ru($nl) == true || strpos($sr, $nl)) { - $n = 0; - } else { + $nl = (new Login())->setLogin($_GET['anml_login'])->get(); - } - - - if ($n == 1) { + if (!empty($nl)) { mysql_query( 'UPDATE `users_animal` SET `name` = "' . mysql_real_escape_string( $nl ) . '",`renameArrayKeys` = "1" WHERE `uid` = "' . $u->info['id'] . '" AND `id` = "' . $an['id'] . '" AND `delete` = "0" LIMIT 1' ); $an['renameArrayKeys'] = 1; - echo 'Вы успешно переименовали питомца в "' . $nl . '"'; + echo 'Вы успешно переименовали питомца в "' . $nl . '"'; } else { - echo 'Эта кличка не подходит'; + echo 'Эта кличка не подходит'; } } @@ -195,7 +179,7 @@ if (!isset($an['id'])) { getBonus(); while ($i < count($statnames->sysBonusNames)) { diff --git a/modules_data/_changepass.php b/modules_data/_changepass.php index d227e67a..cd07f547 100644 --- a/modules_data/_changepass.php +++ b/modules_data/_changepass.php @@ -3,6 +3,8 @@ /* @var $u User */ use Core\Config; +use Core\Db; +use Core\TOTP; use User\Email; use User\Password; @@ -14,23 +16,18 @@ $password = new Password($u->info); $email = new Email($u->info); $status = null; -if ($_POST['oldpsw2']) { // remove psw2 - if (password_verify((int)$_POST['oldpsw2'], $u->info['pass2'])) { - $u->info['pass2'] = $password->changeSecond(null)['pass2']; - $status = "Второй пароль выключен.
"; - } else { - $status = "Введен не верный второй пароль!
"; - } +if ($_POST['removetotp']) { + // Удаление ключа ТОТР + $u->info['totp'] = ''; + Db::sql('update users set totp = ? where id = ?', [$u->info['totp'], $u->info['id']]); + $status = "Секретный ключ удалён.
"; } -if ($_POST['num_count']) { //add psw2 - $arr = $password->changeSecond((int)$_POST['num_count']); - $status = "Второй пароль: {$arr['pass2']}.
- Запомните или запишите, т.к. он не высылается на email и его нельзя как-либо узнать. - Потеряв второй пароль, вы потеряете персонажа!
- Этот пароль выслан на ваш email.
-

"; - $u->info['pass2'] = $arr['hash']; +if ($_POST['newtotp']) { + // Создание ключа ТОТР + $u->info['totp'] = TOTP::otpSecret($u->info['id']); + Db::sql('update users set totp = ? where id = ?', [$u->info['totp'], $u->info['id']]); + $status = "Секретный ключ создан.
"; } if ( @@ -66,7 +63,7 @@ if ( } ?> -
+

Настройки безопасности

@@ -180,41 +177,18 @@ if (
- Второй уровень защиты - Настоятельно рекомендуем включить второй уровень защиты.
- На компьютере может быть установлен клавиатурный шпион, который записывает все нажатия клавиш, таким - образом, - могут узнать ваш пароль.
- Возможно, в сети компьютеров установлен "сетевой снифер", перехватывающий все интернет пакеты, который легко - покажет все пароли. Чтобы обезопасить себя, вы можете установить своему персонажу второй пароль, который - можно - вводить при помощи мышки (клавиатурным шпионом не перехватить) и который передается на игровой сервер в - зашифрованном виде, не поддающимся расшифровке ("сетевой снифер" не сможет перехватить его).
- Будьте внимательны! Второй пароль отправляется на email один раз,при установке второго уровня защиты!
- - info['pass2'])) { - echo "
Второй пароль установлен.

- Введите второй пароль - "; - } else { - ?> - Длина пароля:
- - - - -
- + TOTP + TOTP (Time-based One-Time Password) - это метод двухфакторной аутентификации, который генерирует одноразовый пароль на основе текущего времени. + Устанавливается для повышения безопасности вашего аккаунта, так как помогает защитить его от несанкционированного доступа.
+ Вы можете использовать TOTP приложения, такие как Google Authenticator или Authy, чтобы генерировать и отображать временные одноразовые пароли на вашем мобильном устройстве. +

+ Будьте внимательны! Секретный ключ генерируется только один раз и не подлежит восстановлению. Его можно только удалить или заменить новым.
+ info['totp'])): ?> +
Секретный ключ: +
{$u->info['totp']}


+
+ +
diff --git a/modules_data/_friends.php b/modules_data/_friends.php index b2325556..c15e2378 100644 --- a/modules_data/_friends.php +++ b/modules_data/_friends.php @@ -696,5 +696,4 @@ function printModeratorsOnline(): void -
diff --git a/modules_data/_inv.php b/modules_data/_inv.php index 08fe47c0..b3ea2a15 100644 --- a/modules_data/_inv.php +++ b/modules_data/_inv.php @@ -450,7 +450,7 @@ if (isset($_GET['mAjax'])) { onclick="top.frames['main'].location='main.php?newanimal&rnd='" value="Звери"/> - info['id']", 'vars = sleep']); + if ($sleep && $go['name'] != 'Общ. Этаж 1' && $go['name'] != 'Общ. Этаж 2' && $go['name'] != 'Общ. Этаж 3') { $re = 'Вы можете перемещаться только когда бодрствуете.'; echo ' ' . $re; } elseif ($u->info['timeGo'] >= time()) { @@ -254,10 +250,8 @@ if (isset($_GET['loc'])) { Db::sql('update bs_zv set finish = unix_timestamp() where uid = ? and inBot = 0 and finish = 0', [$u->info['id']]); } - $smt = $u->testAction( - '`uid` = "' . $u->info['id'] . '" AND `time`>=' . (time() - 600) . ' AND `vars` = "create_snowball_cp" LIMIT 1', - 1 - ); + $smt = ActionModel::getOne(["uid = {$u->info['id']}", "time >= unix_timestamp() - 600", 'vars = create_snowball_cp'], 'id'); + if (isset($smt['id'])) { ActionModel::deleteById($smt['id']); } diff --git a/modules_data/_newanimal.php b/modules_data/_newanimal.php index 14d545c5..520a6766 100644 --- a/modules_data/_newanimal.php +++ b/modules_data/_newanimal.php @@ -43,98 +43,6 @@ $an_eda = [ 7.00, ]; -function en_ru($txt) -{ - $g = false; - $en = preg_match("/^(([0-9a-zA-Z _-])+)$/i", $txt); - $ru = preg_match("/^(([0-9а-яА-Я _-])+)$/i", $txt); - if (($ru && $en) || (!$ru && !$en)) { - $g = true; - } - return $g; -} - -// -function testBad($txt) -{ - $white = '-_ 0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNMЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю'; - $r = false; - $i = 0; - while ($i != -1) { - if (isset($txt[$i])) { - $g = false; - $j = 0; - while ($j != -1) { - if (isset($white[$j])) { - if ($white[$j] == $txt[$i]) { - $g = true; - } - } else { - $j = -2; - } - $j++; - } - if (!$g) { - $r = true; - } - } else { - $i = -2; - } - $i++; - } - return $r; -} - -function is_login_an($login) -{ - $r = true; - // - $login = htmlspecialchars($login, null); - // - $bad = [ - 'Мусорщик' => 1, - 'Мироздатель' => 1, - ]; - // - if (isset($login_db['id']) || isset($login_an_db['id']) || isset($bad[$login])) { - $r = false; - } else { - $true = true; - // - /* - Логин может содержать от 2 до 16 символов, и состоять только из букв русского ИЛИ английского алфавита, цифр, символов '_', '-' и пробела. - Логин не может начинаться или заканчиваться символами '_', '-' или пробелом. - */ - // - $login = str_replace(' ', ' ', $login); - $login = str_replace('%', ' ', $login); - $login = str_replace(' ', ' ', $login); - // - if (strlen($login) > 16) { - $true = false; - } elseif (strlen($login) < 2) { - $true = false; - } elseif (strripos($login, ' ') == true) { - $true = false; - } elseif (substr($login, 1) == ' ' || substr($login, -1) == ' ') { - $true = false; - } elseif (substr($login, 1) == '-' || substr($login, -1) == '-') { - $true = false; - } elseif (substr($login, 1) == '_' || substr($login, -1) == '_') { - $true = false; - } elseif (testBad($login) == true) { - $true = false; - } elseif (en_ru(str_replace('ё', 'е', str_replace('Ё', 'Е', $login))) == true) { - $true = false; - } - // - if (!$true) { - $r = false; - } - } - return $r; -} - if (isset($_GET['buy_slot'])) { if ($u->info['money2'] < $slot['price_nex']) { $u->error = 'Недостаточно денег'; @@ -150,8 +58,9 @@ if (isset($_GET['buy_slot'])) { $u->error = 'Нельзя купить больше слотов'; } } elseif (isset($_GET['pet'])) { + $newpetname = (new \Validator\Login())->setLogin($_GET['petname'])->get(); + $_GET['pet'] = round((int)$_GET['pet']); - $_GET['petname'] = htmlspecialchars($_GET['petname'], null); $ax = mysql_fetch_array(mysql_query('SELECT COUNT(*) FROM `users_animal` WHERE `uid` = "' . $u->info['id'] . '" AND `delete` = 0 LIMIT 1')); $ax = $ax[0]; if ($_GET['pet'] < 1 || $_GET['pet'] > 7) { @@ -160,12 +69,12 @@ if (isset($_GET['buy_slot'])) { $u->error = 'Нет свободных слотов для зверя'; } elseif ($u->info['money'] < 50) { $u->error = 'Недостаточно денег'; - } elseif (!is_login_an($_GET['petname'])) { + } elseif (!empty($_GET['petname']) && !$newpetname) { $u->error = 'Неверная кличка зверя, выберите другую'; } else { $u->error = 'Зверь пришел к Вам!'; - $u->info['money'] -= 50; - mysql_query('UPDATE `users` SET `money` = "' . $u->info['money'] . '" WHERE `id` = "' . $u->info['id'] . '" LIMIT 1'); + $u->addKr(-50); + // $anm['type'] = $_GET['pet']; // @@ -206,8 +115,9 @@ if (isset($_GET['buy_slot'])) { $anm['stats'] = 's1=5|s2=3|s3=3|s4=5|rinv=40|m9=5|m6=10'; } // - $anm['name'] = htmlspecialchars($_GET['petname'], null); - $anm['name'] = preg_replace("/&#?[a-z0-9]+;/i", "", $anm['name']); + if (!empty($_GET['petname'])) { + $anm['name'] = htmlspecialchars($newpetname, null); + } // $anm['obraz'] = $anm['obraz'][rand(1, count($anm['obraz']))]; $anm['obraz'] = str_replace('.gif', '', $anm['obraz']); @@ -221,7 +131,7 @@ if (isset($_GET['buy_slot'])) { 1, 'System.inventory', $u->info['id'], - '"System.inventory": Персонаж призвал зверя "' . $_GET['petname'] . '" (' . $_GET['pet'] . ') - 50 кр.', + '"System.inventory": Персонаж призвал зверя "' . $newpetname . '" (' . $_GET['pet'] . ') - 50 кр.', ); } else { $u->error = 'Не удалось призвать зверя, что-то здесь не так ...'; @@ -404,7 +314,7 @@ if ($u->error != '') { // echo ''; // - echo '
' . $pl['name'] . '
'; + echo '
'; // echo '
'; // diff --git a/modules_data/_transfers.php b/modules_data/_transfers.php index 9753fc74..bfa6adde 100644 --- a/modules_data/_transfers.php +++ b/modules_data/_transfers.php @@ -307,4 +307,3 @@ if (!isset($u->tfer['id'])) { ?> {отображаем лог передач} -
\ No newline at end of file diff --git a/modules_data/_umenie.php b/modules_data/_umenie.php index fe40522c..5a9066b3 100644 --- a/modules_data/_umenie.php +++ b/modules_data/_umenie.php @@ -9,6 +9,7 @@ use Core\Config; use DarksLight2\Battle\Techniques\TechniqueCategoryEntity; use DarksLight2\Training\TrainingManager; use Helper\Conversion; +use Model\ActionModel; use Model\Constant\Stat; if (!defined('GAME')) { @@ -1026,7 +1027,7 @@ $tma = '';


Зависимость максимального профильного урона оружием у основных воинских @@ -2318,12 +2319,10 @@ $tma = ''; echo '
  Задержка на получение задания в ' . $u->city_name[$ic1] . ' ' . Conversion::secondsToTimeout((86400 + $pl['time']) - time()) . '

'; } //Пещеры - $dungeon_timeout = $u->testAction( - '`uid` = "' . $u->info['id'] . '" AND `vars` = "psh0" AND `time` > ' . (time() - 60 * 60 * 3) . ' LIMIT 1', - 1 - ); - if ($dungeon_timeout['vars'] == "psh0") { - echo '
Задержка на посещение подземелья: ' . Conversion::secondsToTimeout(60 * 60 * 2 - time() + $dungeon_timeout['time']) . '

'; + $dungeonTimeout = ActionModel::getOne(["uid = {$u->info['id']}", 'vars = psh0', "time > unix_timestamp() - 10800"], 'time'); + if ($dungeonTimeout) { + echo '
+ Задержка на посещение подземелья: ' . Conversion::secondsToTimeout(60 * 60 * 2 - time() + $dungeonTimeout) . '

'; } ?>
@@ -2375,26 +2374,21 @@ $tma = ''; } ?>
testAction( - '`uid` = "' . $u->info['id'] . '" AND `time` >= ' . strtotime('now 00:00:00') . ' AND `vars` = "statistic_today" LIMIT 1', - 1 - ); - if (isset($sf['id'])) { - $sfe = Conversion::dataStringToArray($sf['vals']); - $sf[0] = $u->info['exp'] - (int)$sfe['e']; - $sf[1] = $u->info['win'] - (int)$sfe['w']; - $sf[2] = $u->info['lose'] - (int)$sfe['l']; - $sf[3] = $u->info['nich'] - (int)$sfe['n']; - unset($sfe); - } else { - $sf = [0 => 0, 1 => 0, 2 => 0, 3 => 0]; + $sf = ActionModel::getOne(["uid = {$u->info['id']}", "time >= " . strtotime('now 00:00:00'), 'vars = statistic_today'], 'vals'); + $statisticToday = [0, 0, 0, 0,]; + if ($sf) { + [$statisticToday[0], $statisticToday[1], $statisticToday[2], $statisticToday[3]] = Conversion::dataStringToArray($sf); + $statisticToday[0] = $u->info['exp'] - $statisticToday[0]; + $statisticToday[1] = $u->info['win'] - $statisticToday[1]; + $statisticToday[2] = $u->info['lose'] - $statisticToday[2]; + $statisticToday[3] = $u->info['nich'] - $statisticToday[3]; } ?>       За сегодня
- • Получено опыта:
- • Одержано побед:
- • Проиграно битв:
- • Ничьих:
+ • Получено опыта:
+ • Одержано побед:
+ • Проиграно битв:
+ • Ничьих:
' . $user['login'] . ' [' . $user['level'] . ']inf
'; + ${'tm' . $user['team']} .= '' . $user['login'] . ' [' . $user['level'] . ']inf
'; } if (empty($tm1)) { $tm1 = 'группа пока не набрана'; @@ -572,6 +571,4 @@ if ($zv->error) { seeZv($zi, $r); ?> -
-
diff --git a/modules_data/btl_.php b/modules_data/btl_.php index 8ee0dd90..ab61a7e6 100644 --- a/modules_data/btl_.php +++ b/modules_data/btl_.php @@ -119,22 +119,22 @@ $allprice = Battle::getType($allprice, $thisBattle['smert'] == 1); } if (event.keyCode == 49) { - change_radioKeys(1, false); + change_radioKeys(1); } if (event.keyCode == 50) { - change_radioKeys(2, false); + change_radioKeys(2); } if (event.keyCode == 51) { - change_radioKeys(3, false); + change_radioKeys(3); } if (event.keyCode == 52) { - change_radioKeys(4, false); + change_radioKeys(4); } if (event.keyCode == 53) { - change_radioKeys(5, false); + change_radioKeys(5); } if (event.keyCode == 48) { - change_radioKeys(0, false); + change_radioKeys(); } @@ -188,10 +188,10 @@ $allprice = Battle::getType($allprice, $thisBattle['smert'] == 1); '); - } else { - $error = 'Ошибка перехода в подземелье...'; - } - } else { - $error = 'Ошибка перехода в подземелье...'; - } - } else { - $error = 'Ошибка перехода в подземелье...'; - } - // - //header('location: main.php'); - die(); - }else{ - //Отказался (добавляем квест, системку и пошел нах) - mysql_query('INSERT INTO `dialog_act` ( +if ($u->room['file'] == 'novich') { + + $tst = mysql_fetch_array(mysql_query('SELECT * FROM `dialog_act` WHERE `uid` = "' . $u->info['id'] . '" AND `var` = "noobqst1" LIMIT 1')); + if (!isset($tst['id'])) { + if (isset($_GET['noobgo']) || $c['noobgade'] == false) { + if ($_GET['noobgo'] == 1 && $c['noobgade'] == true) { + //Согласился (создаем пещеру и телепортируем туда + + $ins = mysql_query('INSERT INTO `dungeon_now` (`city`,`uid`,`id2`,`name`,`time_start`) + VALUES ("' . $u->info['city'] . '","' . $u->info['id'] . '","106","Академия Новичков","' . time() . '")'); + if ($ins) { + $zid = mysql_insert_id(); + //обновляем пользователей + $su = mysql_query('SELECT `u`.`id`,`st`.`dn` FROM `stats` AS `st` LEFT JOIN `users` AS `u` ON (`st`.`id` = `u`.`id`) WHERE `st`.`id`="' . $u->info['id'] . '"'); + $ids = ''; + + $map_locs = []; + $spm2 = mysql_query('select id,x,y from dungeon_map where id_dng = 106'); + while ($plm2 = mysql_fetch_array($spm2)) { + $map_locs[] = [$plm2['x'], $plm2['y']]; + } + unset($spm2, $plm2); + + $pxd = 0; + while ($pu = mysql_fetch_array($su)) { + $pxd++; + $ids .= ' `id` = "' . $pu['id'] . '" OR'; + } + $ids = rtrim($ids, 'OR'); + $snew = 0; + $upd1 = mysql_query('UPDATE `stats` SET `s`="4",`res_s`="1",`x`="0",`y`="0",`res_x`="0",`res_y`="0",`dn` = "0",`dnow` = "' . $zid . '" WHERE ' . $ids . ''); + if ($upd1) { + $upd2 = mysql_query('UPDATE `users` SET `room` = "391" WHERE ' . $ids . ''); + //Добавляем ботов и обьекты в пещеру $zid с for_dn = $dungeon['id'] + //Добавляем ботов + $vls = ''; + $sp = mysql_query('select * from dungeon_bots where for_dn = 106'); + while ($pl = mysql_fetch_array($sp)) { + if ($pl['id_bot'] == 0 && $pl['bot_group'] != '') { + $bots = explode(',', $pl['bot_group']); + $pl['id_bot'] = (int)$bots[rand(0, count($bots) - 1)]; + } + if ($pl['id_bot'] > 0) $vls .= '("' . $zid . '","' . $pl['id_bot'] . '","' . $pl['colvo'] . '","' . $pl['items'] . '","' . $pl['x'] . '","' . $pl['y'] . '","' . $pl['dialog'] . '","' . $pl['items'] . '","' . $pl['go_bot'] . '","' . $pl['noatack'] . '"),'; + unset($bots); + } + $vls = rtrim($vls, ','); + $ins1 = mysql_query('INSERT INTO `dungeon_bots` (`dn`,`id_bot`,`colvo`,`items`,`x`,`y`,`dialog`,`atack`,`go_bot`,`noatack`) VALUES ' . $vls . ''); + //Добавляем обьекты + $vls = ''; + $sp = mysql_query('select * from dungeon_obj where for_dn = 106'); + while ($pl = mysql_fetch_array($sp)) { + $vls .= '("' . $zid . '","' . $pl['name'] . '","' . $pl['img'] . '","' . $pl['x'] . '","' . $pl['y'] . '","' . $pl['action'] . '","' . $pl['type'] . '","' . $pl['w'] . '","' . $pl['h'] . '","' . $pl['s'] . '","' . $pl['s2'] . '","' . $pl['os1'] . '","' . $pl['os2'] . '","' . $pl['os3'] . '","' . $pl['os4'] . '","' . $pl['type2'] . '","' . $pl['top'] . '","' . $pl['left'] . '","' . $pl['date'] . '"),'; + } + // + $vls = rtrim($vls, ','); + if ($vls != '') { + $ins2 = mysql_query('INSERT INTO `dungeon_obj` (`dn`,`name`,`img`,`x`,`y`,`action`,`type`,`w`,`h`,`s`,`s2`,`os1`,`os2`,`os3`,`os4`,`type2`,`top`,`left`,`date`) VALUES ' . $vls . ''); + } else { + $ins2 = true; + } + if ($upd2 && $ins1 && $ins2) { + die(''); + } else { + $error = 'Ошибка перехода в подземелье...'; + } + } else { + $error = 'Ошибка перехода в подземелье...'; + } + } else { + $error = 'Ошибка перехода в подземелье...'; + } + // + //header('location: main.php'); + die(); + } else { + //Отказался (добавляем квест, системку и пошел нах) + mysql_query('INSERT INTO `dialog_act` ( `uid`,`var`,`time` ) VALUES ( - "'.$u->info['id'].'","noobqst1","'.time().'" + "' . $u->info['id'] . '","noobqst1","' . time() . '" )'); - - //Начало обучения - $humor = array( - 0 => array( - '' - ), - 1 => array( - '' - ) - ); - $humor = $humor[$u->info['sex']]; - //$u->info['fnq'] = 1; - //mysql_query('UPDATE `users` SET `fnq` = "'.$u->info['fnq'].'" WHERE `id` = "'.$u->info['id'].'" LIMIT 1'); - //Отправляем сообщение в чат о новичке - //mysql_query('UPDATE `items_users` SET `delete` = "'.time().'" WHERE `uid` = "'.$u->info['id'].'" AND `delete` = 0 AND `item_id` = 4703'); - //mysql_query('UPDATE `users` SET `room` = 4 WHERE `id` = "'.$u->info['id'].'" LIMIT 1'); - //mysql_query('UPDATE `stats` SET `hpNow` = 1000,`mpNow` = 1000,`dn` = 0 , `dnow` = 0 , `x` = 0 , `y` = 0 , `s` = 0 WHERE `id` = "'.$u->info['id'].'" LIMIT 1'); - //$u->send('','','','','','В нашем мире появился новый игрок "' . $u->info['login'] . '"! '.$humor[rand(0,count($humor)-1)].'',time(),6,0,0,0,1,0); - //echo '
Вы отказались от обучения, второй попытки больше не будет!
'; - } - }else{ - echo ''; - } - } -?> - - - - - - -
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - + } + } + ?> +
- '.$re.''; } ?> - - - - -
-
-
-
src="//img.new-combats.tech/i/images/subimages/map_zal3.gif" width="135" height="29" class="aFilter" id="mo_1.180.0.1" />
-
-
-
- -
-
- - Чтобы начать играть,Вам нужно прочесть подсказку ( ниже ).
- После прочтения,ниже,воспользуйтесь кнопкой"Возврат"
- testHome(); if(!isset($hgo['id'])){ ?> - -
-
- -
+ + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + + -
+ ' . $re . ''; + } ?> + + + + +
+
+
+
+ src="//img.new-combats.tech/i/images/subimages/map_zal3.gif" width="135" height="29" class="aFilter" id="mo_1.180.0.1"/>
+
+
+
+ +
+
+ + Чтобы начать играть,Вам нужно прочесть подсказку ( ниже ).
+ После прочтения,ниже,воспользуйтесь кнопкой"Возврат"
+ testHome()) { ?> + +
+ + +
+ +
- +
+
-
+
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
-
-Администрация.
+
+ + + + \ No newline at end of file diff --git a/modules_data/location/objaga.php b/modules_data/location/objaga.php index 79ad30ba..335e72aa 100644 --- a/modules_data/location/objaga.php +++ b/modules_data/location/objaga.php @@ -1,4 +1,8 @@ info['admin'] > 0) { } #---пара проверок ;) if (isset($objaga['id'])) { - $sleep = $u->testAction('`vars` = "sleep" AND `uid` = "' . $u->info['id'] . '" LIMIT 1', 1); + $sleep = ActionModel::get(["uid = {$u->info['id']}", 'vars = sleep']); if ($sleep[0] > 0) { if ($u->info['room'] != 217 && $u->info['room'] != 218 && $u->info['room'] != 219) { mysql_query('UPDATE `users` SET `room` = 217 WHERE `id` = "' . $u->info['id'] . '" LIMIT 1'); @@ -797,7 +801,7 @@ if ($u->info['admin'] > 0) { if ($p_count > 9) { echo 'Вы не можете создавать более десяти персонажей
'; } else { - \Core\Db::sql("insert into users_twink + Db::sql("insert into users_twink (uid, twink, login, level, exp, upLevel, stats, time, ability, skills, sskills, nskills, priems, obraz, stopexp) values (?,?,?,4,2500,22,'s1=3|s2=3|s3=3|s4=7|rinv=40|m9=5|m6=10',unix_timestamp(),34,5,4,5, '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|0|0|0|0|0|0|0|0|0|0','0.gif',0)", [$u->info['id'], $p_count, $u->info['login']]); diff --git a/modules_data/location/penter.php b/modules_data/location/penter.php index c95f888a..208382e8 100644 --- a/modules_data/location/penter.php +++ b/modules_data/location/penter.php @@ -1,6 +1,7 @@ room['file'] == 'penter') { $dun = 1; //для новичков 2-7 лвл - $er = ''; - $dzs = ''; - $g111 = 1; - $g11 = $u->testAction('`uid` = "' . $u->info['id'] . '" AND `vars` = "psh1" AND `time`>' . (time() - 7200) . ' LIMIT 1', 1); + + $dungeonTimeout = ActionModel::getOne(["uid = {$u->info['id']}", 'vars = psh1', 'time > unix_timestamp() - 7200'], 'time'); $moder = mysql_fetch_array(mysql_query('SELECT * FROM `moder` WHERE `align` = "' . $u->info['align'] . '" LIMIT 1')); @@ -28,10 +27,10 @@ if ($u->room['file'] == 'penter') { } } - if (isset($g11['id'])) { + if ($dungeonTimeout) { $g111 = 0; if (isset($_GET['start'])) { - $re = 'Поход в пещеры запрещен. Осталось еще: ' . Conversion::secondsToTimeout(7200 - time() + $g11['time']); + $re = 'Поход в пещеры запрещен. Осталось еще: ' . Conversion::secondsToTimeout(7200 - time() + $dungeonTimeout); } } if (isset($_GET['start']) && $zv['uid'] == $u->info['id'] && $g111 == 1) { @@ -379,7 +378,7 @@ if ($u->room['file'] == 'penter') { Но Вы всегда можете приобрести ключ от прохода у любого "копателя пещер" в Торговом зале ;)'; } } diff --git a/modules_data/location/perehod.php b/modules_data/location/perehod.php index 4bc58834..456a1e6b 100644 --- a/modules_data/location/perehod.php +++ b/modules_data/location/perehod.php @@ -1,60 +1,75 @@ room['file']=='perehod') -{ -?> - - - - - - -
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - +if ($u->room['file'] == 'perehod') { + ?> +
- '.$re.''; } ?> - - - - -
-
-
src="//img.new-combats.tech/i/images/subimages/map_zal2.gif" id="mo_1.180.0.0" width="175" height="37" />
-
-
src="//img.new-combats.tech/i/images/subimages/map_zal1.gif" width="88" height="15" class="aFilter" id="mo_1.180.0.2" />
-
-
- -
-
- - Чтобы начать играть,Вам нужно прочесть подсказку ( ниже ).
- После прочтения,ниже,воспользуйтесь кнопкой"Возврат"
- testHome(); if(!isset($hgo['id'])){ ?> - -
-
- -
+ + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + + -
+ ' . $re . ''; + } ?> + + + + +
+
+
+ src="//img.new-combats.tech/i/images/subimages/map_zal2.gif" id="mo_1.180.0.0" width="175" height="37"/>
+
+
+ src="//img.new-combats.tech/i/images/subimages/map_zal1.gif" width="88" height="15" class="aFilter" id="mo_1.180.0.2"/>
+
+
+ +
+
+ + Чтобы начать играть,Вам нужно прочесть подсказку ( ниже ).
+ После прочтения,ниже,воспользуйтесь кнопкой"Возврат"
+ testHome()) { ?> + +
+ + +
+ +
- +
+
-
+
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
-Администрация.
+
+ + + + + \ No newline at end of file diff --git a/modules_data/location/ric_zv.php b/modules_data/location/ric_zv.php index 0dc24d58..5306d214 100644 --- a/modules_data/location/ric_zv.php +++ b/modules_data/location/ric_zv.php @@ -1,82 +1,106 @@ room['file']=='ric_zv') -{ -?> - - - - - - + +
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - -
- '.$re.''; } ?> - - - - -
- error != '' ) { ?> - - error; ?> - -
- - - - - - - - - - room['id']==224) { - ?>
- -
- -
-
- - info['level']<6) - { - echo ' +if ($u->room['file'] == 'ric_zv') { + ?> + + + + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + - + } else { + echo 'Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше.'; + } ?> + + + + -
+ ' . $re . ''; + } ?> + + + + +
+ error != '') { ?> + + error; ?> + +
+ + + + + + + + + + room['id'] == 224) { + ?> +
+ +
+ +
+
+ + info['level'] < 6) { + echo ' Вам все время кажется что за вами следят? Чудится, что случайный попутчик мечтает всадить вам топор в спину? При совершении очередной покупки в гос. магазине мучает ощущение, что вас обманули? Кажется, что симпатичная девушка напротив смотрит на вас как на пищу? Успокойтесь, это не паранойя. Это реалии Capital city. Города Тьмы. '; - }else{ - echo 'Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше.'; - } ?> -
- - + +
- +
+
- - - testHome(); if(!isset($hgo['id'])){ ?> - -
+ + + testHome()) { ?> + +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
-Администрация.
+
+ +
+ \ No newline at end of file diff --git a/modules_data/location/room_hostel.php b/modules_data/location/room_hostel.php index 4d4734e9..0f1b39c9 100644 --- a/modules_data/location/room_hostel.php +++ b/modules_data/location/room_hostel.php @@ -1,6 +1,7 @@ [1 => 'Комната', 2 => 'Хранилище', 4 => 'Сон'], ], ]; -$sleep = $u->testAction('`vars` = "sleep" AND `uid` = "' . $u->info['id'] . '" LIMIT 1', 1); +$sleep = ActionModel::get(["uid = {$u->info['id']}", 'vars = sleep']); if (isset($sleep) and $sleep[0] == 0 and (isset($_GET['ajaxHostel']) and $_GET['ajaxHostel'] == 1 or isset($_GET['ajax']) and $_GET['ajax'] == 1)) { $hostel = mysql_fetch_array(mysql_query("SELECT * FROM `house` WHERE `owner` = '" . mysql_real_escape_string($u->info['id']) . "';")); @@ -170,7 +171,8 @@ function changeSleep($sleep_action) $sleep_mod = 0; ini_set('display_errors', 'Off'); } - $sleep = $u->testAction('`vars` = "sleep" AND `uid` = "' . $u->info['id'] . '" LIMIT 1', 1); + + $sleep = ActionModel::get(["uid = {$u->info['id']}", 'vars = sleep']); } function changePets() diff --git a/modules_data/location/torg.php b/modules_data/location/torg.php index 7b8844a4..4e2df49f 100644 --- a/modules_data/location/torg.php +++ b/modules_data/location/torg.php @@ -1,81 +1,115 @@ room['file']=='torg') -{ -?> - - - - - + +
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- error != '' ) { ?> - - error; ?> - - - - - -
- '.$re.''; } ?> - - -
-
+if ($u->room['file'] == 'torg') { + ?> + + + + + - + } else { + echo 'Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше.'; + } ?> + + + + -
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ error != '') { ?> + + error; ?> + + + + + +
+ ' . $re . ''; + } ?> + + + - -
+
-
onclick="location='main.php?loc=1.180.0.222';" onmouseover="this.className='aFilterhover';" onmouseout="this.className='aFilter';" src="//img.new-combats.tech/i/images/300x225/map_sec3.gif" width="101" height="37" class="aFilter" />
- -
-
-
onclick="location='main.php?loc=1.180.0.220';" onmouseover="this.className='aFilterhover';" onmouseout="this.className='aFilter';" src="//img.new-combats.tech/i/images/300x225/map_2stair.gif" width="120" height="35" class="aFilter" />
- -
- -
-
-
-
onclick="location='main.php?loc=1.180.0.223';" onmouseover="this.className='aFilterhover';" onmouseout="this.className='aFilter';" src="//img.new-combats.tech/i/images/300x225/map_sec4.gif" width="89" height="32" class="aFilter" />
-
- -
-
- - info['level']<6) - { - echo ' +
+ onclick="location='main.php?loc=1.180.0.222';" onmouseover="this.className='aFilterhover';" onmouseout="this.className='aFilter';" + src="//img.new-combats.tech/i/images/300x225/map_sec3.gif" width="101" height="37" class="aFilter"/>
+ +
+
+
+
+ onclick="location='main.php?loc=1.180.0.220';" onmouseover="this.className='aFilterhover';" onmouseout="this.className='aFilter';" + src="//img.new-combats.tech/i/images/300x225/map_2stair.gif" width="120" height="35" class="aFilter"/>
+ +
+ +
+
+
+
+ onclick="location='main.php?loc=1.180.0.223';" onmouseover="this.className='aFilterhover';" onmouseout="this.className='aFilter';" + src="//img.new-combats.tech/i/images/300x225/map_sec4.gif" width="89" height="32" class="aFilter"/>
+
+ + +
+ + info['level'] < 6) { + echo ' Вам все время кажется что за вами следят? Чудится, что случайный попутчик мечтает всадить вам топор в спину? При совершении очередной покупки в гос. магазине мучает ощущение, что вас обманули? Кажется, что симпатичная девушка напротив смотрит на вас как на пищу? Успокойтесь, это не паранойя. Это реалии Capital city. Города Тьмы. '; - }else{ - echo 'Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше.'; - } ?> -
- - + +
- +
+
- - - testHome(); if(!isset($hgo['id'])){ ?> - -
+ + + testHome()) { ?> + +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
-Администрация.
+
+ +
+ \ No newline at end of file diff --git a/modules_data/location/trade_zv.php b/modules_data/location/trade_zv.php index 90caa98e..90be4ed4 100644 --- a/modules_data/location/trade_zv.php +++ b/modules_data/location/trade_zv.php @@ -1,82 +1,106 @@ room['file']=='trade_zv') -{ -?> - - - - - - + +
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - -
- '.$re.''; } ?> - - - - -
- error != '' ) { ?> - - error; ?> - -
- - - - - - - - - - room['id']==221) { - ?>
- -
- -
-
- - info['level']<6) - { - echo ' +if ($u->room['file'] == 'trade_zv') { + ?> + + + + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + - + } else { + echo 'Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше.'; + } ?> + + + + -
+ ' . $re . ''; + } ?> + + + + +
+ error != '') { ?> + + error; ?> + +
+ + + + + + + + + + room['id'] == 221) { + ?> +
+ +
+ +
+
+ + info['level'] < 6) { + echo ' Вам все время кажется что за вами следят? Чудится, что случайный попутчик мечтает всадить вам топор в спину? При совершении очередной покупки в гос. магазине мучает ощущение, что вас обманули? Кажется, что симпатичная девушка напротив смотрит на вас как на пищу? Успокойтесь, это не паранойя. Это реалии Capital city. Города Тьмы. '; - }else{ - echo 'Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше.'; - } ?> -
- - + +
- +
+
- - - testHome(); if(!isset($hgo['id'])){ ?> - -
+ + + testHome()) { ?> + +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
-Администрация.
+
+ +
+ \ No newline at end of file diff --git a/modules_data/location/zalu.php b/modules_data/location/zalu.php index 1f7034a0..42ec94c6 100644 --- a/modules_data/location/zalu.php +++ b/modules_data/location/zalu.php @@ -1,76 +1,99 @@ room['file']=='zalu') -{ -?> - - - - - + +
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - -
- '.$re.''; } ?> - - - - -
-
- -
-
-
onClick="location='main.php?loc=1.180.0.16';" src="//img.new-combats.tech/i/images/300x225/map_klub5-1.gif" width="123" height="30" class="aFilter" />
- -
onClick="location='main.php?loc=1.180.0.376';" src="//img.new-combats.tech/i/images/300x225/map_zalu2.gif" width="122" height="31" class="aFilter" />
-
onClick="location='main.php?loc=1.180.0.375';" src="//img.new-combats.tech/i/images/300x225/map_zalu1.gif" width="122" height="31" class="aFilter" />
- -
-
-
onClick="location='main.php?loc=1.180.0.3';" src="//img.new-combats.tech/i/images/300x225/map_zalu7.gif" width="100" height="35" class="aFilter" />
- -
-
-
- - info['level']<6) - { - echo ' +if ($u->room['file'] == 'zalu') { + ?> + + + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + - + } else { + echo 'Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше.'; + } ?> + + + + -
+ ' . $re . ''; + } ?> + + + + +
+
+ +
+
+
+
+ onClick="location='main.php?loc=1.180.0.16';" src="//img.new-combats.tech/i/images/300x225/map_klub5-1.gif" width="123" height="30" + class="aFilter"/>
+ +
+ onClick="location='main.php?loc=1.180.0.376';" src="//img.new-combats.tech/i/images/300x225/map_zalu2.gif" width="122" height="31" + class="aFilter"/>
+
+ onClick="location='main.php?loc=1.180.0.375';" src="//img.new-combats.tech/i/images/300x225/map_zalu1.gif" width="122" height="31" + class="aFilter"/>
+ +
+
+
+ onClick="location='main.php?loc=1.180.0.3';" src="//img.new-combats.tech/i/images/300x225/map_zalu7.gif" width="100" height="35" + class="aFilter"/>
+ +
+
+
+ + info['level'] < 6) { + echo ' Вам все время кажется что за вами следят? Чудится, что случайный попутчик мечтает всадить вам топор в спину? При совершении очередной покупки в гос. магазине мучает ощущение, что вас обманули? Кажется, что симпатичная девушка напротив смотрит на вас как на пищу? Успокойтесь, это не паранойя. Это реалии Capital city. Города Тьмы. '; - }else{ - echo 'Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше.'; - } ?> -
- - + +
- +
+
- testHome(); if(!isset($hgo['id'])){ ?> - - - - -
+ testHome()) { ?> + + + + +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
-Администрация.
+
+ +
+ \ No newline at end of file diff --git a/modules_data/location/zalu_pal.php b/modules_data/location/zalu_pal.php index 8574beee..6cfacefb 100644 --- a/modules_data/location/zalu_pal.php +++ b/modules_data/location/zalu_pal.php @@ -82,10 +82,10 @@ if (!empty($re)) {
- testHome(); - if (!isset($hgo['id'])) { ?> + testHome()) { ?> diff --git a/modules_data/location/zalu_pal2.php b/modules_data/location/zalu_pal2.php index 1587e3ed..03ad7270 100644 --- a/modules_data/location/zalu_pal2.php +++ b/modules_data/location/zalu_pal2.php @@ -1,64 +1,83 @@ room['file']=='zalu_pal2') -{ -?> - - - - - - -
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - +if ($u->room['file'] == 'zalu_pal2') { + ?> +
- '.$re.''; } ?> - - - - -
-
- -
-
onClick="location='main.php?loc=1.180.0.16';" src="//img.new-combats.tech/i/images/300x225/map_demon3.gif" width="123" height="32" class="aFilter" />
-
-
-
-
- -
-
-
- - Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше. -
- -
+ + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + + -
+ ' . $re . ''; + } ?> + + + + +
+
+ +
+
+ onClick="location='main.php?loc=1.180.0.16';" src="//img.new-combats.tech/i/images/300x225/map_demon3.gif" width="123" height="32" + class="aFilter"/>
+
+
+
+
+
+ +
+
+
+ + Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше. + + +
+ +
- +
+
- testHome(); if(!isset($hgo['id'])){ ?> - - - - -
+ testHome()) { ?> + + + + +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
-Администрация.

+
+ + + + + \ No newline at end of file diff --git a/modules_data/location/zalu_pal3.php b/modules_data/location/zalu_pal3.php index 1a7ff081..fc670a7b 100644 --- a/modules_data/location/zalu_pal3.php +++ b/modules_data/location/zalu_pal3.php @@ -1,73 +1,93 @@ room['file']=='zalu_pal3') -{ -?> - - - - - - - - - - - -
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - +if ($u->room['file'] == 'zalu_pal3') { + ?> +
- '.$re.''; } ?> - - - - -
-
- -
-
onClick="location='main.php?loc=1.180.0.16';" class="aFilter" width="120" height="35" />
-
- -
-
- -
-
-
onClick="location='main.php?loc=1.180.0.3';" src="//img.new-combats.tech/i/images/300x225/map_zalu7.gif" width="100" height="35" class="aFilter" />
- -
-
-
- - Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше. -
- -
+ + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + + -
+ ' . $re . ''; + } ?> + + + + +
+
+ +
+
onClick="location='main.php?loc=1.180.0.16';" + class="aFilter" width="120" height="35"/>
+
+ +
+
+ +
+
+
+ onClick="location='main.php?loc=1.180.0.3';" src="//img.new-combats.tech/i/images/300x225/map_zalu7.gif" width="100" height="35" + class="aFilter"/>
+ +
+
+
+ + Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше. + + +
+ +
- +
+
- testHome(); if(!isset($hgo['id'])){ ?> - - - - -
+ testHome()) { ?> + + + + +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
   
-Администрация.
+
+ + + + +   +   +   + + + \ No newline at end of file diff --git a/modules_data/location/zalu_pal4.php b/modules_data/location/zalu_pal4.php index f75904a3..bc6cee21 100644 --- a/modules_data/location/zalu_pal4.php +++ b/modules_data/location/zalu_pal4.php @@ -1,73 +1,93 @@ room['file']=='zalu_pal4') -{ -?> - - - - - - - - - - - -
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - +if ($u->room['file'] == 'zalu_pal4') { + ?> +
- '.$re.''; } ?> - - - - -
-
- -
-
onClick="location='main.php?loc=1.180.0.16';" class="aFilter" width="120" height="35" />
-
- -
-
- -
-
-
onClick="location='main.php?loc=1.180.0.3';" src="//img.new-combats.tech/i/images/300x225/map_zalu7.gif" width="100" height="35" class="aFilter" />
- -
-
-
- - Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше. -
- -
+ + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + + -
+ ' . $re . ''; + } ?> + + + + +
+
+ +
+
onClick="location='main.php?loc=1.180.0.16';" + class="aFilter" width="120" height="35"/>
+
+ +
+
+ +
+
+
+ onClick="location='main.php?loc=1.180.0.3';" src="//img.new-combats.tech/i/images/300x225/map_zalu7.gif" width="100" height="35" + class="aFilter"/>
+ +
+
+
+ + Возможно, вы ошиблись этажом - настоящие сражения проходят этажом выше. + + +
+ +
- +
+
- testHome(); if(!isset($hgo['id'])){ ?> - - - - -
+ testHome()) { ?> + + + + +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
   
-Администрация.
+
+ + + + +   +   +   + + + \ No newline at end of file diff --git a/modules_data/location/zv2.php b/modules_data/location/zv2.php index 18aff3c5..f0fcd6e8 100644 --- a/modules_data/location/zv2.php +++ b/modules_data/location/zv2.php @@ -1,70 +1,120 @@ room['file']=='zv2') -{ -?> - - - - - + +
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - -
- '.$re.''; } ?> - - - - -
-
-
-
src="//img.new-combats.tech/i/images/300x225/map_bk.gif" width="120" height="35" title="" class="aFilter" />
-
-
-
-
-
-
-
-
- -
-
- - info['level']<6) - { - echo ' +if ($u->room['file'] == 'zv2') { + ?> + + + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + - + } ?> + + + + -
+ ' . $re . ''; + } ?> + + + + +
+
+
+
+
+ src="//img.new-combats.tech/i/images/300x225/map_bk.gif" width="120" height="35" title="" class="aFilter"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + info['level'] < 6) { + echo ' Вам все время кажется что за вами следят? Чудится, что случайный попутчик мечтает всадить вам топор в спину? При совершении очередной покупки в гос. магазине мучает ощущение, что вас обманули? Кажется, что симпатичная девушка напротив смотрит на вас как на пищу? Успокойтесь, это не паранойя. Это реалии Capital city. Города Тьмы. '; - } ?> -
- - + +
- +
+
- - - testHome(); if(!isset($hgo['id'])){ ?> -
+ + + testHome()) { ?> +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
-Администрация.
+
+ +
+ \ No newline at end of file diff --git a/modules_data/location/zv3.php b/modules_data/location/zv3.php index da41c1c9..bac59faf 100644 --- a/modules_data/location/zv3.php +++ b/modules_data/location/zv3.php @@ -1,74 +1,122 @@ room['file']=='zv3') -{ -?> - - - - - + +
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - -
- error != '' ) { - $re = $u->error; - } - if($re!=''){ echo ''.$re.''; } ?> - - - - -
-
-
-
src="//img.new-combats.tech/i/images/300x225/map_bk.gif" width="120" height="35" title="" class="aFilter" />
-
-
-
-
-
-
-
-
- -
-
- - info['level']<6) - { - echo ' +if ($u->room['file'] == 'zv3') { + ?> + + + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + - + } ?> + + + + -
+ error != '') { + $re = $u->error; + } + if ($re != '') { + echo '' . $re . ''; + } ?> + + + + +
+
+
+
+ src="//img.new-combats.tech/i/images/300x225/map_bk.gif" width="120" height="35" title="" class="aFilter"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + info['level'] < 6) { + echo ' Вам все время кажется что за вами следят? Чудится, что случайный попутчик мечтает всадить вам топор в спину? При совершении очередной покупки в гос. магазине мучает ощущение, что вас обманули? Кажется, что симпатичная девушка напротив смотрит на вас как на пищу? Успокойтесь, это не паранойя. Это реалии Capital city. Города Тьмы. '; - } ?> -
- - + +
- +
+
- - - testHome(); if(!isset($hgo['id'])){ ?> -
+ + + testHome()) { ?> +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
-Администрация.
+
+ +
+ \ No newline at end of file diff --git a/modules_data/location/zv4.php b/modules_data/location/zv4.php index 678665be..0df156a1 100644 --- a/modules_data/location/zv4.php +++ b/modules_data/location/zv4.php @@ -1,69 +1,118 @@ room['file']=='zv4') -{ -?> - - - - - + +
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } ?> -
- - - - -
- '.$re.''; } ?> - - - - -
-
-
-
src="//img.new-combats.tech/i/images/300x225/map_bk.gif" width="120" height="35" title="" class="aFilter" />
-
-
-
-
-
-
-
-
- -
-
- - info['level']<6) - { - echo ' +if ($u->room['file'] == 'zv4') { + ?> + + + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } ?> + +
+ + + - + } ?> + + + + -
+ ' . $re . ''; + } ?> + + + + +
+
+
+
+
+ src="//img.new-combats.tech/i/images/300x225/map_bk.gif" width="120" height="35" title="" class="aFilter"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + info['level'] < 6) { + echo ' Вам все время кажется что за вами следят? Чудится, что случайный попутчик мечтает всадить вам топор в спину? При совершении очередной покупки в гос. магазине мучает ощущение, что вас обманули? Кажется, что симпатичная девушка напротив смотрит на вас как на пищу? Успокойтесь, это не паранойя. Это реалии Capital city. Города Тьмы. '; - } ?> -
- - + +
- +
+
- - testHome(); if(!isset($hgo['id'])){ ?> -
+ + testHome()) { ?> +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
-Администрация.
+
+ +
+ \ No newline at end of file diff --git a/modules_data/location/zv_svet.php b/modules_data/location/zv_svet.php index bed8b75a..d5b5fccc 100644 --- a/modules_data/location/zv_svet.php +++ b/modules_data/location/zv_svet.php @@ -1,82 +1,105 @@ room['file']=='zv_svet') -{ - $u->abilsRoom('test'); -?> - - - - - - + +
- getInfoPers($u->info['id'],0); if($usee!=false){ echo $usee[0]; }else{ echo 'information is lost.'; } - echo '
'.$u->abilsRoom('look').'
'; - ?> -
- - - - -
- '.$re.''; } ?> - - - - -
- error != '' ) { ?> - - error; ?> - -
- - - - - - - - - - room['id']==220) { - ?>
- -
- -
-
- - info['level']<6) - { - echo ' +if ($u->room['file'] == 'zv_svet') { + $u->abilsRoom('test'); + ?> + + + + + +
+ getInfoPers($u->info['id'], 0); + if ($usee != false) { + echo $usee[0]; + } else { + echo 'information is lost.'; + } + echo '
' . $u->abilsRoom('look') . '
'; + ?> +
+
+ + + - + } ?> + + + + -
+ ' . $re . ''; + } ?> + + + + +
+ error != '') { ?> + + error; ?> + +
+ + + + + + + + + + room['id'] == 220) { + ?> +
+ +
+ +
+
+ + info['level'] < 6) { + echo ' Вам все время кажется что за вами следят? Чудится, что случайный попутчик мечтает всадить вам топор в спину? При совершении очередной покупки в гос. магазине мучает ощущение, что вас обманули? Кажется, что симпатичная девушка напротив смотрит на вас как на пищу? Успокойтесь, это не паранойя. Это реалии Capital city. Города Тьмы. '; - } ?> -
- - + +
- +
+
- - - testHome(); if(!isset($hgo['id'])){ ?> -
+ + + testHome()) { ?> +
Внимание!Смените пароль на уникальный,который не использовался ранее в подобных проектах,это обезопасит вашего персонажа от взлома.
- Администрация.

-
- -
-Администрация.
+
+ +
+ \ No newline at end of file diff --git a/modules_data/stats_inv.php b/modules_data/stats_inv.php index cc717b40..128a48a8 100644 --- a/modules_data/stats_inv.php +++ b/modules_data/stats_inv.php @@ -1,5 +1,6 @@ rep['rep3'] - $u->rep['rep3_buy']; return $val; } - $rz0 = ''; + $rz0 = ''; $rz0 .= ''; if ($uShow[0] == 1) { $i = 1; @@ -580,7 +581,7 @@ $repovo = $u->rep['rep3'] - $u->rep['rep3_buy']; } } $rz0 .= ''; - $rz1 = ''; + $rz1 = ''; if ($uShow[1] == 1) { //if( $u->info['admin'] > 0 ) { $rz1 .= ''; } - $rz2 = ''; + $rz2 = ''; if ($uShow[2] == 1) { $rz2 .= ''; } - $rz3 = ''; + $rz3 = ''; if ($uShow[3] == 1) { $rz3 .= '