Descubre los mejores servidores privados de Metin2. Vota por tus favoritos, explora nuevas comunidades y encuentra tu próxima aventura.
Recompensas por votar fáciles, gratuitas y fiables para tu servidor privado de Metin2
Nuestro Sistema de Verificación de Votos es una solución moderna e innovadora diseñada específicamente para servidores privados de Metin2. Ofrece una forma atractiva de que los jugadores voten por sus servidores favoritos mientras reciben beneficios dentro del juego.
El sistema es fácil de implementar y altamente confiable, lo que lo convierte en una excelente elección para los propietarios que desean aumentar la participación de los jugadores y la visibilidad del servidor.
Nuestro objetivo es crear una situación en la que todos ganan tanto para los jugadores como para los administradores. Los jugadores reciben recompensas por su lealtad, mientras que los servidores ganan visibilidad y mayor participación.
Sistema completo de votación y recompensas dentro del juego con interfaz personalizada
Vote4Buff es nuestra solución premium todo en uno que incluye una atractiva interfaz dentro del juego, comunicación WebSocket e integración completa con el servidor. ¡Los jugadores pueden votar, elegir entre múltiples pools de bonus y recibir recompensas al instante sin salir del juego!
El sistema Vote4Buff se compone de tres componentes principales:
Perfecto para: Propietarios que desean una solución profesional lista para usar sin invertir semanas en desarrollo personalizado. ¡Configura los pools, integra los archivos y listo!
Obtén todos los archivos necesarios para la integración en cliente y servidor
Vote4Buff está diseñado para la base de código martysama0134 v5.8. Si usas otra base, puede que necesites ajustar algunos cambios.
Incluye libcurl.dll (32 bits incluido, 64 bits disponible)
Incluye todas las modificaciones necesarias del código C++
Por favor, inicia sesión para descargar los archivos de Vote4Buff.
Configura pools de bonus, recompensas y ajustes de la API
Toda la configuración de Vote4Buff se realiza en el archivo char.h de tu servidor. A continuación encontrarás ejemplos detallados de cada opción.
Empieza configurando tu ID de servidor y tu token API (disponibles en tu panel):
// 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 !!!
Puedes definir hasta 3 pools de bonus que los jugadores pueden elegir. Cada pool puede incluir múltiples bonificaciones:
// 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
},
};
Bonos comunes: 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, entre muchos otros.
Configura los ítems que los jugadores recibirán automáticamente al votar:
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
};
Controla el tiempo de reutilización y el coste cuando los jugadores quieran cambiar de pool sin volver a votar:
// 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)
Nota: Después de votar, los jugadores pueden elegir un pool de bonus gratis. El tiempo de espera y el precio solo se aplican si quieren cambiar sin volver a votar.
Instrucciones paso a paso para integrar Vote4Buff
¡Haz copias de seguridad de tus archivos de cliente y servidor! Convención de nombres: los archivos con prefijo __ requieren fusionar cambios, los demás pueden copiarse directamente.
Abre Source/Server/__char.h del paquete descargado.
class CBuffOnAttributes; y añade el código de configuración justo arriba (consulta la sección de configuración)s_VOTE4BUFF_SERVER_ID y s_VOTE4BUFF_API_TOKENbool DragonSoul_RefineWindow_CanRefine(); y agrega las declaraciones públicas necesariasIntegra los archivos del lado del servidor incluidos en el paquete:
__affect.h - Fusiona los cambios en tu archivo affect.h existente__chat_affect.cpp - Añade el manejo de efectos de Vote4Buff__cmd_general.cpp - Añade el procesamiento de comandos__desc_client.cpp - Ajustes al descriptor del clienteLos archivos con prefijo __ indican que debes fusionar los cambios con tus archivos actuales.
Compila tu servidor con las nuevas modificaciones.
make clean && make
En la carpeta Client/root/:
uivote4buff.py en la carpeta root/ de tu cliente
__constInfo.py__game.py__interfaceModule.py__uiAffectShower.pyClient/ui/game/vote4buff/ a ui/game/ en tus paquetes
Client/uiscript/vote4buffwindow.py en tu carpeta de uiscripts
Añade las cadenas de idioma desde Client/locale/:
__locale_game.txt a tu archivo locale_game.txt
__locale_interface.txt a tu archivo locale_interface.txt
Idiomas disponibles: EN, DE, ES, PL, TR, RO, IT, PT, HU, GR, CZ
En Source/Client/UserInterface/:
M2WebSocket.cpp y M2WebSocket.h en el directorio UserInterface
__ a tus archivos existentes
libcurl.dll esté en tu directorio del cliente (32 bits incluido, descarga 64 bits si es necesario)
Vote4Buff no agrega un botón por defecto. Debes llamar a ToggleVote4Buff() desde algún lugar de tu interfaz. Por ejemplo:
O usa la clase incluida Vote4BuffButton, que crea un icono arrastrable.
Compila de nuevo tu ejecutable del cliente con las modificaciones.
Prueba la integración:
Tus jugadores ahora pueden votar y recibir recompensas automáticamente. La interfaz Vote4Buff les mostrará cuándo pueden votar, les permitirá elegir pools de bonus y exhibirá temporizadores para los efectos activos.
La mayoría de los jugadores descubren servidores a través de toplists, por lo que es una herramienta esencial de marketing
Documentación detallada y guías paso a paso facilitan la puesta en marcha
Proceso de integración REST simple
La verificación desde el cliente minimiza la carga para tu servidor
Sistema probado con protección incorporada contra fraude
Asegura que los jugadores realmente votaron antes de recompensarlos
El flujo es claro e intuitivo para los jugadores. Además, la comprobación del voto se realiza mediante nuestra API, garantizando que solo se verifiquen votos legítimos.
Desde tu sitio web o la interfaz dentro del juego
El jugador es dirigido a la página de tu servidor en nuestra toplist
Completa el CAPTCHA y envía su voto
Tu servidor consulta nuestra API para verificar el voto
Tu servidor entrega la recompensa dentro del juego
Elige el método de integración que mejor se adapte a tus necesidades:
Solución completa con interfaz personalizada, comunicación WebSocket y recompensas automáticas.
Crea tu propia implementación usando nuestra API REST para tener máximo control.
Crea una cuenta y añade tu servidor en nuestra toplist en https://metin2-toplist.net/servers/create
Encuentra tu ID de servidor y token API en tu panel. Son necesarios para la autenticación.
Descarga Vote4Buff para una solución lista o integra nuestra API para una implementación personalizada.
Prueba el sistema de votación a fondo y luego publícalo en tu servidor en producción.
Si utilizas el sistema Vote4Buff (recomendado), esta API ya está integrada. Esta sección es para propietarios que deseen crear su propia implementación.
https://metin2-toplist.net/api/check-vote
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
api_token |
string | Sí | Tu token API único |
ip |
string | Opcional* | Dirección IP del jugador (IPv4 o IPv6) |
account_id |
string | Opcional* | ID de cuenta o nombre de usuario del jugador para seguimiento preciso |
Para mejores resultados, usa <code>account_id</code> y así identificar a cada jugador. El método con <code>ip</code> puede ser menos fiable si usan VPN o cambian de ubicación.
Envía a los jugadores a votar usando esta estructura de URL:
https://metin2-toplist.net/vote.{lang}/{server_id}-{server_slug}/{account_id}
Ejemplos:
https://metin2-toplist.net/vote.en/123-awesome-server/PlayerName
https://metin2-toplist.net/vote.de/123-awesome-server/PlayerName
https://metin2-toplist.net/vote.tr/123-awesome-server/PlayerName
Idiomas disponibles: en, de, es, pl, tr, ro, it, pt, hu, gr, cz
La API devuelve una respuesta JSON con la siguiente estructura:
{
"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"
}
| Campo | Tipo | Descripción |
|---|---|---|
success |
boolean | Indica si la petición fue exitosa |
voted |
boolean | Indica si se encontró un voto válido (solo si success=true) |
last_vote |
string | Marca de tiempo ISO 8601 del último voto (solo si voted=true) |
next_vote_in |
integer | Segundos restantes para volver a votar (solo si voted=true) |
message |
string | Mensaje descriptivo con el resultado |
<?php
function checkVote($apiToken, $playerIP) {
$url = "https://metin2-toplist.net/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-toplist.net/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-toplist.net/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-toplist.net/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!');
}
});
Guarda tu token API de forma segura y nunca lo expongas en código del lado del cliente. Las peticiones a la API deben realizarse desde tu backend.
Añade un botón en tu web o un comando dentro del juego que dirija a los jugadores a tu página de voto en https://metin2-toplist.net/servers/YOUR-SERVER-SLUG.
Cuando un jugador solicite su recompensa (desde la web o el juego), verifica si ya votó:
voted es true, concede la recompensaBuenas prácticas recomendadas:
Solución: Comprueba que estás usando el token correcto desde tu panel y que no incluye espacios o caracteres adicionales.
Posibles causas:
Solución: Asegúrate de que tu servidor pueda hacer solicitudes HTTPS salientes. Revisa la configuración del firewall e implementa reintentos con backoff exponencial.
Solución: Lleva un registro local de las recompensas entregadas para evitar duplicados.
Solución: Envía la dirección IPv6 completa. Nuestra API acepta IPv4 e IPv6.
Prueba tu integración a fondo con una cuenta de pruebas antes de subirla a producción. Asegúrate de cubrir todos los casos y posibles errores.