?php // Naglowki blokujace stary cache przegladarki header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); error_reporting(0); $db_host = '127.0.0.1'; $db_port = 3306; $db_user = 'root'; $db_pass = '9bd13cbadfc375971e37ff4093f6164fd8ba745b9abd18ae'; function getDb($dbname) { global $db_host, $db_port, $db_user, $db_pass; try { return new PDO("mysql:host=$db_host;port=$db_port;dbname=$dbname;charset=utf8mb4", $db_user, $db_pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_TIMEOUT => 2 ]); } catch (Exception $e) { return null; } } $pdo_account = getDb('account'); $pdo_player = getDb('player'); // Automatyczne dynamiczne wykrycie zdjecia admin1 / admin (dowolne rozszerzenie i wielkosc liter) $admin_img = 'admin1.jpg'; $found_admin1 = glob('/var/www/metin2-register/*[aA][dD][mM][iI][nN]1*'); if (empty($found_admin1) === false) { $admin_img = basename($found_admin1[0]); } else { $found_admin = glob('/var/www/metin2-register/*[aA][dD][mM][iI][nN]*'); if (empty($found_admin) === false) { $admin_img = basename($found_admin[0]); } } $admin_cache_v = file_exists('/var/www/metin2-register/' . $admin_img) ? filemtime('/var/www/metin2-register/' . $admin_img) : time(); function getJobInfo($job) { $baseJob = ((int)$job) % 4; switch ($baseJob) { case 0: return ['Wojownik', '⚔️', 'job-warrior']; case 1: return ['Ninja', '🗡️', 'job-ninja']; case 2: return ['Sura', '🔮', 'job-sura']; case 3: return ['Szaman', '⚡', 'job-shaman']; default: return ['Wojownik', '⚔️', 'job-warrior']; } } function formatPlaytime($minutes) { $m = (int)$minutes; if ($m < 60) return $m . ' min'; $hours = floor($m / 60); $mins = $m % 60; if ($hours < 24) return $hours . 'h ' . $mins . 'm'; $days = floor($hours / 24); $remHours = $hours % 24; return $days . 'd ' . $remHours . 'h'; } // 1. API: Statystyki na zywo i kanaly if (isset($_GET['api']) && $_GET['api'] === 'live') { header('Content-Type: application/json; charset=utf-8'); $online = 0; $accounts = 0; $players = 0; $guilds = 0; if ($pdo_player !== null) { try { $online = (int)$pdo_player->query("SELECT COUNT(*) FROM player WHERE last_play > NOW() - INTERVAL 15 MINUTE")->fetchColumn(); $players = (int)$pdo_player->query("SELECT COUNT(*) FROM player")->fetchColumn(); $guilds = (int)$pdo_player->query("SELECT COUNT(*) FROM guild")->fetchColumn(); } catch (Exception $e) {} } if ($pdo_account !== null) { try { $accounts = (int)$pdo_account->query("SELECT COUNT(*) FROM account")->fetchColumn(); } catch (Exception $e) {} } $ch1 = floor($online * 0.46); $ch2 = floor($online * 0.34); $ch3 = max(0, $online - $ch1 - $ch2); echo json_encode([ 'online' => number_format($online, 0, '', ' '), 'ch1' => number_format($ch1, 0, '', ' '), 'ch2' => number_format($ch2, 0, '', ' '), 'ch3' => number_format($ch3, 0, '', ' '), 'accounts' => number_format($accounts, 0, '', ' '), 'players' => number_format($players, 0, '', ' '), 'guilds' => number_format($guilds, 0, '', ' ') ]); exit; } // Chat API if (isset($_GET['api']) && $_GET['api'] === 'chat_get') { header('Content-Type: application/json; charset=utf-8'); $f = '/var/www/metin2-register/chat_data.json'; $msgs = file_exists($f) ? json_decode(@file_get_contents($f), true) : []; if (!is_array($msgs)) $msgs = []; echo json_encode(['ok' => true, 'msgs' => array_slice($msgs, -50)]); exit; } if (isset($_GET['api']) && $_GET['api'] === 'chat_send' && $_SERVER['REQUEST_METHOD'] === 'POST') { header('Content-Type: application/json; charset=utf-8'); session_start(); $ip = $_SERVER['REMOTE_ADDR'] ?? ''; $now = time(); if (($now - ($_SESSION['chat_t'] ?? 0)) < 3) { echo json_encode(['ok'=>false,'msg'=>'Zbyt szybko! Poczekaj 3 sekundy.']); exit; } $nick = trim($_POST['nick'] ?? ''); $text = trim($_POST['message'] ?? ''); $pin = trim($_POST['pin'] ?? ''); if (mb_strlen($nick,'UTF-8') < 2 || mb_strlen($nick,'UTF-8') > 24) { echo json_encode(['ok'=>false,'msg'=>'Nick: 2-24 znaki.']); exit; } if (mb_strlen($text,'UTF-8') < 1 || mb_strlen($text,'UTF-8') > 250) { echo json_encode(['ok'=>false,'msg'=>'Wiadomość: 1-250 znaków.']); exit; } $admin_nick = (bool)preg_match('/\[(SA|GA|GM)\]|sapiesik|zaxep/i', $nick); $role = 'player'; if ($admin_nick) { if ($pin === 'grw2026') { $role = 'admin'; } else { echo json_encode(['ok'=>false,'msg'=>'Ten nick jest zastrzeżony dla Administratora.']); exit; } } $clean_nick = htmlspecialchars($nick, ENT_QUOTES, 'UTF-8'); $clean_text = htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); $f = '/var/www/metin2-register/chat_data.json'; $msgs = file_exists($f) ? json_decode(@file_get_contents($f), true) : []; if (!is_array($msgs)) $msgs = []; $msgs[] = ['id'=>$now, 'nick'=>$clean_nick, 'role'=>$role, 'msg'=>$clean_text, 'time'=>date('H:i')]; if (count($msgs) > 60) $msgs = array_slice($msgs, -60); @file_put_contents($f, json_encode($msgs, JSON_UNESCAPED_UNICODE)); $_SESSION['chat_t'] = $now; echo json_encode(['ok'=>true]); exit; } if (isset($_GET['api']) && $_GET['api'] === 'chat_del' && $_SERVER['REQUEST_METHOD'] === 'POST') { header('Content-Type: application/json; charset=utf-8'); $id = (int)($_POST['id'] ?? 0); $pin = trim($_POST['pin'] ?? ''); if ($pin !== 'grw2026' || $id <= 0) { echo json_encode(['ok'=>false]); exit; } $f = '/var/www/metin2-register/chat_data.json'; $msgs = file_exists($f) ? json_decode(@file_get_contents($f), true) : []; if (is_array($msgs)) { $msgs = array_values(array_filter($msgs, function($m) use ($id) { return (int)($m['id']??0) !== $id; })); @file_put_contents($f, json_encode($msgs, JSON_UNESCAPED_UNICODE)); } echo json_encode(['ok'=>true]); exit; } // 2. Formularz rejestracji ze stalym czystym VIPem (Premium do 2038) $reg_error = ''; $reg_success = ''; $active_tab = 'presentation'; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'register') { $active_tab = 'register'; $login = trim($_POST['login'] ?? ''); $password = $_POST['password'] ?? ''; $password_repeat = $_POST['password_repeat'] ?? ''; $social_id = trim($_POST['social_id'] ?? ''); if ($social_id === '') $social_id = '1234567'; $email = strtolower($login) . '@grwmt2.pl'; if (preg_match('/^[a-zA-Z0-9]{4,16}$/', $login) === 0) { $reg_error = "Login musi miec od 4 do 16 znakow (tylko litery i cyfry)."; } elseif (strlen($password) < 6) { $reg_error = "Haslo musi miec co najmniej 6 znakow."; } elseif ($password !== $password_repeat) { $reg_error = "Wpisane hasla nie sa identyczne."; } elseif (preg_match('/^[0-9]{7}$/', $social_id) === 0) { $reg_error = "Kod usuniecia postaci musi skladac sie z 7 cyfr."; } elseif ($pdo_account === null) { $reg_error = "Blad polaczenia z baza kont."; } else { try { $stmt = $pdo_account->prepare("SELECT id FROM account WHERE login = ?"); $stmt->execute([$login]); if ($stmt->fetch()) { $reg_error = "Wybrany login jest juz zajety."; } else { $sql = "INSERT INTO account ( login, password, social_id, email, securitycode, status, availDt, create_time, last_play, premium_expire, safebox_expire, autoloot_expire, fish_mind_expire, marriage_fast_expire, money_drop_rate_expire, gold_expire, silver_expire ) VALUES ( ?, PASSWORD(?), ?, ?, '', 'OK', NOW(), NOW(), NOW(), '2038-01-01 00:00:00', '1970-01-01 00:00:00', '1970-01-01 00:00:00', '1970-01-01 00:00:00', '1970-01-01 00:00:00', '1970-01-01 00:00:00', '1970-01-01 00:00:00', '1970-01-01 00:00:00' )"; $ins = $pdo_account->prepare($sql); $ins->execute([$login, $password, $social_id, $email]); $reg_success = "Konto " . htmlspecialchars($login) . " zostalo pomyslnie utworzone! Kod usuniecia postaci: " . htmlspecialchars($social_id) . ". Pakiet Premium VIP na stale aktywny!"; } } catch (Exception $e) { $reg_error = "Blad bazy: " . $e->getMessage(); } } } // 3. Obsluga zgloszen Discord $ticket_error = ''; $ticket_success = ''; $discord_webhook_url = "https://discord.com/api/webhooks/1562537355384979507/kvNS5-GFtPELIS2GXQg02jTFa0MECjppK-UzyRD49fz-9lzmzjGn6uyA89f6KcJPJHKB"; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'ticket') { $active_tab = 'support'; $nick = trim($_POST['nick'] ?? ''); $contact = trim($_POST['contact'] ?? ''); $category = trim($_POST['category'] ?? 'Inne'); $subject = trim($_POST['subject'] ?? ''); $message = trim($_POST['message'] ?? ''); if ($nick === '' || $subject === '' || $message === '') { $ticket_error = "Wypelnij wymagane pola (Nick, Temat, Tresc)."; } else { $contact_val = ($contact !== '') ? $contact : 'Brak'; $payload = [ 'username' => 'GRWMT2 Support Bot', 'embeds' => [ [ 'title' => '📩 Nowe Zgloszenie: ' . $subject, 'description' => $message, 'color' => 16426522, 'fields' => [ ['name' => '👤 Nick', 'value' => $nick, 'inline' => true], ['name' => '🏷️ Kategoria', 'value' => $category, 'inline' => true], ['name' => '📱 Kontakt', 'value' => $contact_val, 'inline' => true] ], 'footer' => ['text' => 'GRWMT2 Portal • ' . date('d.m.Y H:i:s')], 'timestamp' => date('c') ] ] ]; $opts = [ 'http' => [ 'header' => "Content-Type: application/json\r\n", 'method' => 'POST', 'content' => json_encode($payload), 'timeout' => 5 ] ]; $res = @file_get_contents($discord_webhook_url, false, stream_context_create($opts)); $ticket_success = "Twoje zgloszenie zostalo wyslane bezposrednio do administracji na Discordzie!"; } } // 4. Rankingi (Filtrowanie adminow + Oznaczenie botow i graczy) $admin_filter = "('admin', 'sura', 'ninja', 'wojownik', 'szaman', 'tomek', 'test', 'test1', 'saper11', 'saper111')"; $top_level = []; $top_time = []; $top_guilds = []; if ($pdo_player !== null) { try { $online_count = (int)$pdo_player->query("SELECT COUNT(*) FROM player WHERE last_play > NOW() - INTERVAL 15 MINUTE")->fetchColumn(); $players_count = (int)$pdo_player->query("SELECT COUNT(*) FROM player")->fetchColumn(); $guilds_count = (int)$pdo_player->query("SELECT COUNT(*) FROM guild")->fetchColumn(); // Top Poziom $stmt_lvl = $pdo_player->query(" SELECT p.name, p.level, p.exp, p.playtime, p.job, (CASE WHEN a.login LIKE 'playerbot_%' THEN 1 ELSE 0 END) AS is_bot FROM player p LEFT JOIN account.account a ON p.account_id = a.id WHERE p.name NOT LIKE '[%]%' AND LOWER(p.name) NOT IN $admin_filter AND LOWER(p.name) NOT LIKE 'admin%' AND LOWER(p.name) NOT LIKE 'test%' AND p.name NOT IN (SELECT mName FROM common.gmlist) ORDER BY p.level DESC, p.exp DESC LIMIT 25 "); $top_level = $stmt_lvl->fetchAll(); // Top Czas Gry $stmt_time = $pdo_player->query(" SELECT p.name, p.level, p.playtime, p.job, (CASE WHEN a.login LIKE 'playerbot_%' THEN 1 ELSE 0 END) AS is_bot FROM player p LEFT JOIN account.account a ON p.account_id = a.id WHERE p.name NOT LIKE '[%]%' AND LOWER(p.name) NOT IN $admin_filter AND LOWER(p.name) NOT LIKE 'admin%' AND LOWER(p.name) NOT LIKE 'test%' AND p.name NOT IN (SELECT mName FROM common.gmlist) ORDER BY p.playtime DESC LIMIT 25 "); $top_time = $stmt_time->fetchAll(); // Top Gildie $stmt_g = $pdo_player->query(" SELECT name, level, ladder_point FROM guild ORDER BY level DESC, ladder_point DESC LIMIT 15 "); $top_guilds = $stmt_g->fetchAll(); } catch (Exception $e) {} } if ($pdo_account !== null) { try { $accounts_count = (int)$pdo_account->query("SELECT COUNT(*) FROM account")->fetchColumn(); } catch (Exception $e) {} } $ch1_online = floor($online_count * 0.46); $ch2_online = floor($online_count * 0.34); $ch3_online = max(0, $online_count - $ch1_online - $ch2_online); // 5. Czysty dziennik aktualizacji $updates = [ [ 'date' => 'Aktualizacja', 'title' => '2.37.0 — Zaklęty Las, Mapy 90 Poziomu i Nowa Ekonomia Botów', 'badge' => 'WERSJA 2.37.0', 'items' => [ 'Wyprawa Zaklęty Las: Nowa drużynowa wyprawa Erebu (5–8 graczy od 95 lvl) za Świątynią Ochao na bossów Bagjanamu i Jotun Thrym (cenne Skrzynie Jotuna i Bagjanamu) oraz 7 misji strażników lasu (nagroda: Kamień Driad).', 'Nowe Mapy 90 Poziomu: Przylądek Smoczego Ognia, Zbocze Gautama, Nefrytowa Zatoka i Gromiste Góry – z bezpośrednimi portalami oraz szybkim dostępem u Teleportera od 90 lvl.', 'Koniec limitu EXP: Pasek doświadczenia nie ucina się już na wartości 2.14 mld EXP – pełne doświadczenie powyżej 100 poziomu zapisuje się w bazie w całości bez strat.', 'Czysty rynek i Magiczny Pył: Boty nie wystawiają już Kamieni Duszy +0, +1 i +2 – wymieniają je u Alchemika w Magiczny Pył, oczyszczając rynek z niepotrzebnych przedmiotów.', 'Kamienie Duszy +3 i +4 w stosach: Boty wystawiają cenne kamienie jednym wygodnym stosem – kupujesz ze straganu dokładnie tyle sztuk, ile potrzebujesz.', 'Błyskawiczne łączenie ksiąg: Boty porządkują swoje sklepy i wystawiają Księgi Umiejętności w pełnych, przejrzystych stosach.', 'Ekspedycje botów: Zaawansowane boty (od 100 lvl) wyruszają w drużynach do Zaklętego Lasu, a od 95 lvl polują na bossy i Metiny na nowych mapach 90 poziomu.', 'Misja Seon-Hae: Duży suplement oraz cenne odłamki zdobywa się teraz na potworach w Zaklętym Lesie.' ] ], [ 'date' => 'Aktualizacja', 'title' => '2.36.0 — Sklepy Botów 2x Większe, Płynne Lochy i Auto-Łowy Bez Zemsty', 'badge' => 'WERSJA 2.36.0', 'items' => [ 'Boty wolą sklepy graczy: Boty priorytetowo skupują przedmioty od graczy – wybierają oferty gracza nawet jeśli są do 10% droższe niż u innych botów!', 'Dwukrotnie większe sklepy botów: Stragany offline botów posiadają teraz 4 strony towaru i trzymają zapas wolnego miejsca, co zapobiega przepełnieniu rynku.', 'Cenne przedmioty zawsze na rynku: Boty nigdy nie zdejmują przedmiotów z dwoma bonusami, od +7 w górę, broni na 30 lvl, Stalek ani drogich Ksiąg Umiejętności.', 'Płynne lochy bez zacięć: Automatyczny nadzór celów w lochach (Wieża Demonów, Katakumby, Razador, Nemere, Ruiny Dżungli i inne) – zaginione cele odnawiają się same, eliminując zawieszanie się etapów.', 'Auto-Łowy bez zemsty: Przypadkowe uderzenie bota podczas korzystania z Auto-Łowów nie prowokuje go do walki, nie zrywa rozejmu ani nie ściąga jego grupy/gildii.', 'Smocza Alchemia w sklepach: Kamienie Smoczej Alchemii można teraz bezpośrednio wystawiać na straganach i kupować prosto do dedykowanego okna alchemii.', 'Materiały i Cor Draconis w stosach: Medale Konia, Cor Draconis, materiały rzemieślnicze i szarfy wystawiane są w stosach z opcją zakupu dowolnej ilości sztuk.', 'Ochrona zbierania ziół: Trafienie lub ogłuszenie przez potwora nie przerywa już zbierania ziół.' ] ] ]; ?>
Oficjalny serwer społeczności Garwolina i okolic. Klasyczny klimat Metin2 z najlepszymi udogodnieniami – 100% za darmo i bez Pay-to-Win!
Tak wygląda codzienna rozgrywka na GRWMT2 — setki straganów, aktywny handel, wierzchowce i prawdziwe tłumy w miastach!
Oficjalny skład projektu GRWMT2. Pamiętaj: prawdziwy Administrator nigdy nie prosi o Twoje hasło!
Zarządzanie projektem, organizacja eventów, kontakt ze społecznością graczy Garwolina oraz opieka nad serwerem.
Główny Programista & Twórca Silnika MT2009 Plus. Rozwój sztucznej inteligencji botów, optymalizacja silnika i mechanik gry.
Boty to nie osobny program klikający w grę, tylko postacie prowadzone przez sam serwer. Widzisz je tak jak innych graczy: biegają, używają umiejętności, noszą prawdziwy ekwipunek, a ich postępy zapisują się w bazie. Każdy bot ma osobowość i ambicję, które decydują o tym, czym się zajmuje.
Wojownik, Ninja (sztylet i łuk), Sura i Szaman — z kombosami, buffami i rotacją umiejętności.
Od wiosek przez Dolinę Orków, pustynię i Górę Sohan po Doyyumhwaji. Boty omijają przeszkody i przechodzą między mapami.
Łowcy Metinów, drużyny na Wodza Orków, Królową Pająków czy Ognistego Króla, rajdy do Wieży Demonów i Katakumb.
Biolog, polowania, Medale Konne i próby na konia bojowego — boty robią je same.
Ulepszają ekwipunek, używają zwojów, dobierają bonusy do klasy, a przedmioty od 30 lvl niosą do kowala gildyjnego.
Zbierają Cor Draconis, ulepszają Smocze Kamienie i wystawiają nadwyżki na sprzedaż.
Budują własne szarfy, wymieniają materiały i odblokowują juki konne.
Łowią ryby, kopią rudę, zbierają zioła i robią z nich mikstury.
Boty łączą się w drużyny od 2 do 8 osób. Możesz zaprosić bota do swojej — szaman Cię buffuje, łucznik luruje.
Najsilniejsze boty zakładają gildie, rekrutują członków i oddają doświadczenie gildii.
Mistrzowie kupują działki, a gildia robi uczciwą zrzutkę na Kwaterę Główną, kowala i alchemika.
Gildie tego samego królestwa walczą na mapie gildii, pijąc mikstury i wracając z obozu. Najwyżej 20 na 20.
Boty piszą na czacie, odpowiadają na wiadomości i ogłoszenia handlowe („kupię...”, „sprzedam...”).
Przyjmują wyzwania na pojedynek, bronią się przed napastnikami, a w wojnach królestw walczą z innymi.
Nad każdym botem widać, co właśnie robi: poluje, handluje, łowi, idzie do miasta.
Twój własny bot, który chodzi z Tobą, zakłada to, co mu dasz, i walczy u Twojego boku.
Darmowe konto w kilka sekund • Automatyczny stały VIP 2038
Po odbiór darmowych SM zgłoś się do administratora poprzez zgłoszenie w zakładce Pomoc / Support.
Pisz na żywo ze społecznością! Umawiaj się na expienie, handel w M1 i wyprawy gildyjne.
| # | Postać | Klasa | Poziom | EXP | Czas Gry |
|---|
Bieżące prace rozwojowe, nowości i usprawnienia na serwerze GRWMT2.
Masz problem lub propozycję? Wyślij wiadomość bezpośrednio do administracji na Discordzie.
Wstępnie skonfigurowana paczka gry GRWMT2 z wbudowanym Trackerem Bossów i 3 kanałami.
🚀 POBIERZ GRWMT2.RAR (~2.0 GB)
Przejdź do zakładki Szybka Rejestracja u góry strony.
Wpisz swój Login i Hasło. Twoje konto jest gotowe w 5 sekund i posiada aktywny stały pakiet VIP!
Kliknij powyższy złoty przycisk POBIERZ GRWMT2.RAR (2.0 GB).
Po pobraniu wypakuj całą zawartość programem WinRAR lub 7-Zip do dowolnego folderu (np. D:\GRWMT2). Gra nie wymaga instalatora!
W wypakowanym folderze z grą uruchom plik Aktualizuj-i-graj.bat.
⚠️ BARDZO WAŻNE: Gdy pojawi się okno patchera i skończy sprawdzać pliki, zamknij patcher krzyżykiem [X] w prawym górnym rogu.
Nie klikaj przycisku „GRAJ” w patcherze! Gra uruchomi się automatycznie z wszystkimi 3 kanałami (CH1, CH2, CH3) oraz wbudowanym Trackerem Bossów i Metinów!