Discover the best Metin2 private servers. Vote for your favorite servers, explore new communities, and find your next gaming adventure.
Snadné, bezplatné a spolehlivé hlasování s odměnami pro váš Metin2 privátní server
Náš systém ověřování hlasů je moderní a inovativní řešení navržené speciálně pro Metin2 privátní servery. Nabízí atraktivní způsob, jak mohou hráči hlasovat pro svůj oblíbený server a zároveň získat odměny ve hře.
Systém je zároveň snadno implementovatelný a velmi spolehlivý, takže je ideální volbou pro administrátory, kteří chtějí zvýšit zapojení hráčů a viditelnost serveru.
Naším cílem je vytvořit win-win situaci pro hráče i provozovatele serveru. Hráči jsou za svou věrnost odměněni bonusy ve hře a servery získávají vyšší viditelnost i aktivitu.
Kompletní systém hlasování a odměn přímo ve hře s vlastním UI
Vote4Buff je naše prémiové komplexní řešení, které obsahuje propracované herní UI, komunikaci přes WebSockety a plnou integraci na straně serveru. Hráči mohou hlasovat, vybírat z více balíčků bonusů a získat odměny okamžitě bez opuštění hry!
Systém Vote4Buff se skládá ze tří hlavních částí:
Ideální pro: Administrátory, kteří chtějí profesionální hotové řešení bez týdnů vlastního vývoje. Stačí nakonfigurovat balíčky, nahrát soubory a můžete spustit!
Získejte všechny soubory potřebné pro integraci na klientovi i serveru
Vote4Buff je navržen pro zdrojovou bázi martysama0134 v5.8. Používáte-li jiný základ, může být nutné provést úpravy.
Součástí je libcurl.dll (32bit verze, 64bit lze stáhnout samostatně)
Obsahuje všechny potřebné úpravy zdrojových souborů v C++
Pro stažení souborů se prosím přihlaste.
Nastavte balíčky bonusů, předměty a API připojení
Veškerá konfigurace Vote4Buff probíhá v souboru char.h na vašem serveru. Níže najdete detailní příklady každé možnosti.
Nejprve nakonfigurujte ID serveru a API token (najdete v panelu serveru):
// API SETTINGS from Metin2 Server List
static const std::string s_VOTE4BUFF_SERVER_ID = "YOUR_SERVER_ID"; // From dashboard
static const std::string s_VOTE4BUFF_API_TOKEN = "YOUR_API_TOKEN"; // From dashboard
static const int s_VOTE4BUFF_DURATION = 86400; // seconds (1 day) DO NOT MODIFY THIS !!!
Můžete definovat až 3 balíčky bonusů, ze kterých si hráči vybírají. Každý balíček může obsahovat více bonusů:
// Bonuses must be set with its APPLY_ declaration.
// You can add as many bonuses as you want per slot.
static std::vector<std::vector<std::pair<int, int>>> s_VOTE4BUFF_BONUSES =
{
{ // Bonus Pool 1: PvP Focused
{ APPLY_ATTBONUS_HUMAN, 5 }, // +5% vs Players
{ APPLY_DEF_GRADE_BONUS, 50 }, // +50 Defense
// Add more bonuses if wanted
},
{ // Bonus Pool 2: PvE Focused
{ APPLY_ATTBONUS_MONSTER, 5 }, // +5% vs Monsters
{ APPLY_ATTBONUS_INSECT, 5 }, // +5% vs Insects
{ APPLY_HP_REGEN, 10 }, // +10 HP Regen
},
{ // Bonus Pool 3: Farm Focused
{ APPLY_ITEM_DROP_BONUS, 10 }, // +10% Drop Rate
{ APPLY_EXP_DOUBLE_BONUS, 10 }, // +10% EXP
{ APPLY_GOLD_FIND, 15 }, // +15% Gold
},
};
Běžné typy bonusů: APPLY_ATTBONUS_HUMAN, APPLY_ATTBONUS_MONSTER, APPLY_DEF_GRADE_BONUS, APPLY_ITEM_DROP_BONUS, APPLY_EXP_DOUBLE_BONUS, APPLY_GOLD_FIND, APPLY_MAX_HP, APPLY_MAX_SP, APPLY_HP_REGEN, APPLY_SP_REGEN, APPLY_CRITICAL_PCT, APPLY_PENETRATE_PCT a mnoho dalších!
Nastavte předměty, které hráč obdrží automaticky po hlasování:
static std::vector<std::pair<DWORD, int>> s_VOTE4BUFF_ITEM_REWARDS =
{
// Leave empty if you don't want to give any items as rewards
// Format: { vnum, count }
{ 27007, 5 }, // 5x Red Potion (XXL)
{ 50084, 1 }, // 1x Gold Bar
{ 71027, 10 }, // 10x Dragon Coin
};
Řiďte cooldown a cenu, když chce hráč přepnout na jiný balíček bez dalšího hlasu:
// Cooldown when changing bonus (does not apply when choosing right after voting)
static const int s_VOTE4BUFF_CHANGE_BONUS_COOLDOWN = 300; // seconds (5 minutes)
// Price when changing bonus (does not apply when choosing right after voting)
static const int s_VOTE4BUFF_CHANGE_BONUS_PRICE = 15000; // yang (0 = free)
Poznámka: Po hlasování si hráč může vybrat balíček ZDARMA. Cooldown a cena platí pouze tehdy, když chce balíček změnit bez dalšího hlasu.
Krok za krokem k integraci Vote4Buff
Udělejte si zálohy klientských i serverových souborů! Konvence názvů: soubory s prefixem __ vyžadují sloučení s vašimi existujícími soubory, ostatní lze zkopírovat přímo.
Otevřete soubor Source/Server/__char.h z balíčku.
class CBuffOnAttributes; a vložte konfigurační kód nad něj (viz sekce Konfigurace)s_VOTE4BUFF_SERVER_ID a s_VOTE4BUFF_API_TOKENbool DragonSoul_RefineWindow_CanRefine(); a přidejte veřejné deklarace metodIntegrujte serverové soubory z balíčku:
__affect.h – upravte svůj existující affect.h dle dodaných změn__chat_affect.cpp – přidejte zpracování efektů Vote4Buff__cmd_general.cpp – doplňte zpracování příkazů__desc_client.cpp – úpravy klientských deskriptorůPoznámka: soubory s prefixem __ znamenají, že musíte změny sloučit se svými existujícími soubory.
Znovu zkompilujte herní server s novými úpravami.
make clean && make
Ve složce Client/root/:
uivote4buff.py do složky root/ vašeho klienta
__constInfo.py__game.py__interfaceModule.py__uiAffectShower.pyClient/ui/game/vote4buff/ do ui/game/ vašeho balíčku
Client/uiscript/vote4buffwindow.py do složky uiscript
Přidejte texty pro podporované jazyky ze složky Client/locale/:
__locale_game.txt ke svému locale_game.txt
__locale_interface.txt ke svému locale_interface.txt
Dostupné jazyky: EN, DE, ES, PL, TR, RO, IT, PT, HU, GR, CZ
Ze složky Source/Client/UserInterface/:
M2WebSocket.cpp a M2WebSocket.h do UserInterface
__ do svých existujících souborů
libcurl.dll je v klientském adresáři (32bit verze je součástí, 64bit stáhněte zvlášť)
Vote4Buff nepřidává výchozí tlačítko. Funkci ToggleVote4Buff() musíte zavolat z některé části UI. Například:
Můžete využít i dodanou třídu Vote4BuffButton, která vytvoří přetáhnutelné ikonové tlačítko
Přeložte klientskou aplikaci s novými úpravami.
Ověřte integraci:
Hráči nyní mohou hlasovat a automaticky získávat odměny. UI Vote4Buff jim ukáže, kdy mohou hlasovat, umožní výběr bonusů a zobrazí odpočty aktivních efektů.
Většina nových hráčů nachází servery přes toplisty, proto je to klíčový marketingový kanál
Detailní dokumentace a postupy krok za krokem
Jednoduché REST API s jasným postupem integrace
Ověřování hlasů na klientovi minimalizuje zátěž serveru
Ověřený systém s ochranou proti podvodům
Máte jistotu, že hráči opravdu hlasovali před udělením odměny
Systém nabízí jasný a přívětivý proces, který hráči snadno pochopí. Ověřování hlasů probíhá přes naše API, takže vždy ověříte pravost hlasu.
Z vašeho webu nebo přímo z herního rozhraní
Hráč je přesměrován na stránku vašeho serveru v toplistu
Hráč dokončí CAPTCHA a odešle hlas
Váš server odešle dotaz na naše API a ověří hlas
Server předá hráči odměnu ve hře
Vyberte si způsob integrace podle svých potřeb:
Kompletní řešení s vlastním UI, komunikací přes WebSocket a automatickými odměnami.
Postavte si vlastní řešení pomocí našeho REST API pro maximální flexibilitu.
Vytvořte si účet a přidejte server do našeho toplistu na adrese https://metin2.p42.studio/servers/create
V panelu serveru najdete jedinečné ID serveru a API token. Bez nich se nelze k API připojit.
Stáhněte Vote4Buff pro hotové řešení, nebo využijte API pro vlastní implementaci.
Důkladně otestujte hlasovací systém a poté jej nasaďte na produkci.
Pokud používáte systém Vote4Buff (doporučeno), je toto API již součástí! Tato sekce je určena pro administrátory, kteří chtějí vytvořit vlastní implementaci.
https://metin2.p42.studio/api/check-vote
| Parametr | Typ | Povinné | Popis |
|---|---|---|---|
api_token |
string | Ano | Jedinečný API klíč vašeho serveru |
ip |
string | Volitelné* | IP adresa hráče (IPv4 nebo IPv6) |
account_id |
string | Volitelné* | ID účtu / uživatelské jméno pro přesnější sledování |
Pro nejlepší výsledky používejte <code>account_id</code>, které zajišťuje přesné spárování hráčů. Parametr <code>ip</code> může být méně spolehlivý při použití VPN nebo změně sítě.
Hráče přesměrujte na hlasování pomocí této struktury URL:
https://metin2.p42.studio/vote.{lang}/{server_id}-{server_slug}/{account_id}
Příklady:
https://metin2.p42.studio/vote.en/123-awesome-server/PlayerName
https://metin2.p42.studio/vote.de/123-awesome-server/PlayerName
https://metin2.p42.studio/vote.tr/123-awesome-server/PlayerName
Podporované jazyky: en, de, es, pl, tr, ro, it, pt, hu, gr, cz
API vrací JSON odpověď v následující struktuře:
{
"success": true,
"voted": true,
"last_vote": "2025-11-11T14:30:00Z",
"next_vote_in": 0,
"message": "Vote verified successfully"
}
{
"success": true,
"voted": false,
"message": "No recent vote found"
}
{
"success": false,
"message": "Invalid API token"
}
| Pole | Typ | Popis |
|---|---|---|
success |
boolean | Zda byl požadavek na API zpracován úspěšně |
voted |
boolean | Zda byl nalezen platný hlas (pouze pokud success=true) |
last_vote |
string | Časové razítko posledního hlasu ve formátu ISO 8601 (pouze pokud voted=true) |
next_vote_in |
integer | Počet sekund do dalšího hlasu (pouze pokud voted=true) |
message |
string | Srozumitelná zpráva popisující výsledek |
<?php
function checkVote($apiToken, $playerIP) {
$url = "https://metin2.p42.studio/api/check-vote";
$params = http_build_query([
'api_token' => $apiToken,
'ip' => $playerIP
]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . '?' . $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
return ['success' => false, 'message' => 'API request failed'];
}
return json_decode($response, true);
}
// Usage Example
$apiToken = 'YOUR_API_TOKEN_HERE';
$playerIP = $_SERVER['REMOTE_ADDR']; // Or get from your game server
$result = checkVote($apiToken, $playerIP);
if ($result['success'] && $result['voted']) {
// Player has voted! Give reward
echo "Vote verified! Rewarding player...";
giveReward($playerName); // Your reward function
} else {
echo "No valid vote found. Please vote first!";
}
?>
import requests
import json
def check_vote(api_token, player_ip):
"""
Check if a player has voted for the server
"""
url = "https://metin2.p42.studio/api/check-vote"
params = {
'api_token': api_token,
'ip': player_ip
}
try:
response = requests.get(url, params=params, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
return {'success': False, 'message': f'API request failed: {str(e)}'}
# Usage Example
api_token = 'YOUR_API_TOKEN_HERE'
player_ip = '123.456.789.012'
result = check_vote(api_token, player_ip)
if result.get('success') and result.get('voted'):
print("Vote verified! Rewarding player...")
# Give reward to player
else:
print("No valid vote found. Please vote first!")
#include <curl/curl.h>
#include <string>
#include <sstream>
// Callback function for cURL
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
bool CheckVote(const std::string& apiToken, const std::string& playerIP) {
CURL* curl;
CURLcode res;
std::string readBuffer;
curl = curl_easy_init();
if(curl) {
std::ostringstream url;
url << "https://metin2.p42.studio/api/check-vote"
<< "?api_token=" << apiToken
<< "&ip=" << playerIP;
curl_easy_setopt(curl, CURLOPT_URL, url.str().c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if(res == CURLE_OK) {
// Parse JSON response (you'll need a JSON library like nlohmann/json)
// Check if readBuffer contains "\"voted\":true"
return readBuffer.find("\"voted\":true") != std::string::npos;
}
}
return false;
}
// Usage in your game server
void OnPlayerRequestReward(const std::string& playerName, const std::string& playerIP) {
std::string apiToken = "YOUR_API_TOKEN_HERE";
if(CheckVote(apiToken, playerIP)) {
// Give reward to player
GiveItemToPlayer(playerName, REWARD_ITEM_VNUM, REWARD_COUNT);
SendNotice("Vote verified! You received your reward!");
} else {
SendNotice("No valid vote found. Please vote first!");
}
}
async function checkVote(apiToken, playerIP) {
const url = new URL('https://metin2.p42.studio/api/check-vote');
url.searchParams.append('api_token', apiToken);
url.searchParams.append('ip', playerIP);
try {
const response = await fetch(url, {
method: 'GET',
headers: {
'Accept': 'application/json'
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('API request failed:', error);
return { success: false, message: error.message };
}
}
const apiToken = 'YOUR_API_TOKEN_HERE';
const playerIP = '123.456.789.012';
checkVote(apiToken, playerIP).then(result => {
if (result.success && result.voted) {
console.log('Vote verified! Rewarding player...');
// Give reward to player
} else {
console.log('No valid vote found. Please vote first!');
}
});
API token ukládejte vždy bezpečně a nikdy jej nezveřejňujte v kódu na straně klienta. Požadavky na API odesílejte výhradně z backendu vašeho serveru.
Přidejte na web nebo do hry tlačítko, které hráče nasměruje na hlasovací stránku vašeho serveru na adrese https://metin2.p42.studio/servers/YOUR-SERVER-SLUG.
Když hráč požádá o odměnu (na webu nebo ve hře), postupujte následovně:
voted true, udělte odměnuDoporučené postupy pro práci s odměnami:
Řešení: Ověřte, že používáte správný API token z panelu serveru. Zkontrolujte, zda v něm nejsou mezery nebo jiné znaky navíc.
Možné příčiny:
Řešení: Ujistěte se, že váš server může odesílat odchozí HTTPS požadavky. Zkontrolujte nastavení firewallu a implementujte opakované pokusy s exponenciálním zpožděním.
Řešení: Veďte lokální evidenci odměněných hlasů. Ukládejte čas hlasu a každou odměnu udělte jen jednou.
Řešení: Ujistěte se, že posíláte kompletní IPv6 adresu. Naše API podporuje IPv4 i IPv6.
Důkladně otestujte integraci na testovacím účtu před nasazením do produkce. Ujistěte se, že pokrýváte všechny okrajové i chybové scénáře.