Descubra os melhores servidores privados de Metin2. Vote nos seus favoritos, explore novas comunidades e encontre a sua próxima aventura no jogo.
Recompensas de voto fáceis, gratuitas e fiáveis para o seu servidor privado Metin2
O nosso Sistema de Verificação de Votos é uma solução moderna e inovadora criada especificamente para servidores privados de Metin2. Fornece uma forma envolvente de os jogadores votarem nos seus servidores favoritos enquanto recebem benefícios no jogo.
O sistema é fácil de implementar e altamente fiável, tornando-o uma excelente escolha para proprietários que procuram aumentar o envolvimento dos jogadores e a visibilidade do servidor.
O nosso objetivo é criar uma situação vantajosa para todos — os jogadores são recompensados pela sua lealdade com benefícios no jogo, enquanto os servidores beneficiam de maior visibilidade e envolvimento.
Sistema completo de votação e recompensas no jogo com interface personalizada
Vote4Buff é a nossa solução premium tudo-em-um para votação, que inclui uma interface deslumbrante no jogo, comunicação por WebSocket e integração completa com o servidor. Os jogadores podem votar, escolher entre múltiplos pacotes de bónus e receber recompensas instantaneamente sem sair do jogo!
O sistema Vote4Buff é composto por três componentes principais:
Perfeito para: Proprietários que desejam uma solução profissional pronta a usar sem gastar semanas em desenvolvimento personalizado. Basta configurar os pacotes de bónus, integrar os ficheiros e está pronto a funcionar!
Obtenha todos os ficheiros necessários para integração no cliente e no servidor
Vote4Buff foi desenhado para a base de código martysama0134 v5.8. Se estiver a usar uma fonte diferente, poderão ser necessárias adaptações.
Inclui libcurl.dll (versão 32 bits incluída, 64 bits disponível)
Inclui todas as modificações necessárias no código-fonte C++
Por favor, inicie sessão para transferir os ficheiros Vote4Buff.
Configure os pacotes de bónus, as recompensas por item e as definições da API
Toda a configuração do Vote4Buff é feita no ficheiro char.h do seu servidor. Veja em baixo exemplos detalhados de cada opção.
Comece por configurar o ID do seu servidor e a chave API (disponíveis no seu painel):
// 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 !!!
Pode definir até 3 pacotes de bónus para os jogadores escolherem. Cada pacote pode conter vários bónus:
// 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
},
};
Tipos de bónus comuns: 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 e muitos mais!
Configure os itens que os jogadores recebem automaticamente após 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
};
Controle o tempo de espera e o custo quando os jogadores quiserem alternar entre pacotes de bónus:
// 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: Depois de votar, os jogadores podem escolher um pacote de bónus gratuitamente. O tempo de espera e o custo só se aplicam quando pretendem mudar de pacote mais tarde sem voltar a votar.
Instruções passo a passo para integrar o Vote4Buff
Certifique-se de que tem cópias de segurança dos ficheiros do cliente e do servidor! Convenção de nomes: ficheiros com o prefixo __ requerem alterações, ficheiros sem prefixo podem ser copiados diretamente.
Abra Source/Server/__char.h do pacote transferido.
class CBuffOnAttributes; e adicione o código de configuração acima (ver secção Configuração)s_VOTE4BUFF_SERVER_ID e s_VOTE4BUFF_API_TOKENbool DragonSoul_RefineWindow_CanRefine(); e adicione as declarações de métodos públicosIntegre os ficheiros do lado do servidor incluídos no pacote:
__affect.h - Atualize o seu affect.h existente com as alterações fornecidas__chat_affect.cpp - Adicione a gestão de efeitos do Vote4Buff__cmd_general.cpp - Adicione o processamento dos comandos__desc_client.cpp - Modificações no descritor de clienteNota: ficheiros com o prefixo __ indicam que deve fundir as alterações com os seus ficheiros atuais.
Compile o game server com as novas modificações.
make clean && make
Na pasta Client/root/:
uivote4buff.py para a pasta root/ do seu cliente
__constInfo.py__game.py__interfaceModule.py__uiAffectShower.pyClient/ui/game/vote4buff/ para ui/game/ do seu pack
Client/uiscript/vote4buffwindow.py para a pasta uiscript
Adicione as strings de locale para os idiomas suportados a partir de Client/locale/:
__locale_game.txt ao seu locale_game.txt
__locale_interface.txt ao seu locale_interface.txt
Idiomas disponíveis: EN, DE, ES, PL, TR, RO, IT, PT, HU, GR, CZ
Em Source/Client/UserInterface/:
M2WebSocket.cpp e M2WebSocket.h para a pasta UserInterface
__ aos seus ficheiros existentes
libcurl.dll está na pasta do cliente (32 bits incluído, transfira a versão 64 bits se necessário)
O Vote4Buff não adiciona um botão por defeito. Tem de chamar ToggleVote4Buff() a partir de algum ponto da sua UI. Por exemplo:
Ou utilize a classe Vote4BuffButton incluída, que cria um ícone arrastável
Recompile o executável do cliente com as novas modificações.
Teste a integração:
Os seus jogadores podem agora votar e receber recompensas automaticamente. A interface do Vote4Buff mostra quando podem votar, permite escolher pacotes de bónus e apresenta contadores regressivos para os efeitos ativos.
A maioria dos novos jogadores descobre servidores através de toplists — é uma ferramenta essencial de marketing
Documentação detalhada e guias passo a passo tornam tudo simples
Integração REST simples e direta
A verificação do voto no lado do cliente reduz o impacto no servidor
Sistema comprovado com prevenção de fraude integrada
Confirme que os jogadores realmente votaram antes de entregar recompensas
O fluxo é simples e intuitivo para os jogadores. Melhor ainda: a verificação é feita via API, garantindo que apenas votos legítimos são aceites!
A partir do seu site ou da interface do jogo
O jogador é encaminhado para a página de votação do seu servidor na toplist
Completa o CAPTCHA e envia o voto
O seu servidor consulta a API para confirmar o voto
O servidor entrega a recompensa dentro do jogo
Escolha o método de integração que melhor se adapta às suas necessidades:
Solução completa com interface personalizada, comunicação WebSocket e recompensas automáticas.
Construa a sua própria implementação com a nossa API REST para total flexibilidade e controlo.
Crie uma conta e adicione o seu servidor à nossa toplist em https://metin2-toplist.net/servers/create
No painel do servidor encontrará o ID e a chave API exclusivos necessários para autenticação.
Transfira o Vote4Buff para uma solução pronta ou use a nossa API para integração personalizada.
Teste o sistema de votação exaustivamente e depois publique no servidor oficial.
Se estiver a usar o Sistema Vote4Buff (recomendado), esta API já está integrada! Esta secção é para quem deseja uma implementação própria.
https://metin2-toplist.net/api/check-vote
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
api_token |
string | Sim | Token API único do seu servidor |
ip |
string | Opcional* | Endereço IP do jogador (IPv4 ou IPv6) |
account_id |
string | Opcional* | ID ou username do jogador para monitorização mais precisa |
Para melhores resultados, use <code>account_id</code> para uma monitorização precisa. O método <code>ip</code> pode ser menos fiável se os jogadores usarem VPNs ou jogarem de locais diferentes.
Direcione os jogadores a votar usando esta estrutura de URL:
https://metin2-toplist.net/vote.{lang}/{server_id}-{server_slug}/{account_id}
Exemplos:
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 suportados: en, de, es, pl, tr, ro, it, pt, hu, gr, cz
A API responde em JSON com a seguinte estrutura:
{
"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 | Descrição |
|---|---|---|
success |
boolean | Indica se o pedido foi bem-sucedido |
voted |
boolean | Indica se foi encontrado um voto válido (apenas quando success=true) |
last_vote |
string | Timestamp ISO 8601 do último voto (quando voted=true) |
next_vote_in |
integer | Segundos até que um novo voto seja permitido (quando voted=true) |
message |
string | Mensagem legível que descreve o 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!');
}
});
Guarde a sua chave API em segurança e nunca a exponha em código cliente. As chamadas à API devem ser feitas a partir do backend.
Adicione um botão no site ou um comando no jogo que redirecione os jogadores para a página de votos em https://metin2-toplist.net/servers/YOUR-SERVER-SLUG.
Quando o jogador solicitar a recompensa (no site ou no jogo), verifique se ele votou:
voted for true, entregue a recompensaBoas práticas para o processamento das recompensas:
Solução: Verifique se está a usar a chave correta do painel. Certifique-se de que não existem espaços extra.
Causas possíveis:
Solução: Certifique-se de que o seu servidor pode fazer pedidos HTTPS externos. Verifique a firewall e implemente nova tentativa com backoff exponencial.
Solução: Implemente controlo local de votos recompensados. Guarde o timestamp e garanta que cada voto é premiado apenas uma vez.
Solução: Envie o endereço IPv6 completo. A nossa API suporta IPv4 e IPv6.
Teste a integração com uma conta de testes antes de publicar. Garanta que cobre todos os cenários e erros.