Découvrez les meilleurs serveurs privés Metin2. Votez pour vos favoris, explorez de nouvelles communautés et trouvez votre prochaine aventure de jeu.
Des récompenses de vote simples, gratuites et fiables pour votre serveur privé Metin2
Notre système de vérification des votes est une solution moderne et innovante pensée spécialement pour les serveurs privés Metin2. Il offre aux joueurs un moyen attrayant de voter pour leurs serveurs préférés tout en recevant des avantages en jeu.
Le système est à la fois simple à implémenter et hautement fiable, ce qui en fait un excellent choix pour les administrateurs souhaitant augmenter l’engagement des joueurs et la visibilité de leur serveur.
Notre objectif est de créer une situation gagnant-gagnant pour les joueurs comme pour les propriétaires. Les joueurs sont récompensés pour leur loyauté et les serveurs gagnent en visibilité et en activité.
Solution complète de vote et de récompenses en jeu avec interface personnalisée
Vote4Buff est notre solution premium tout-en-un qui inclut une interface en jeu élégante, une communication WebSocket et une intégration serveur complète. Les joueurs peuvent voter, choisir parmi plusieurs pools de bonus et recevoir des récompenses instantanément sans quitter le jeu !
Le système Vote4Buff se compose de trois éléments principaux :
Idéal pour : Les administrateurs qui souhaitent une solution professionnelle clé en main sans investir des semaines de développement personnalisé. Configurez les pools, intégrez les fichiers et profitez-en !
Récupérez tous les fichiers nécessaires pour l’intégration client et serveur
Vote4Buff est conçu pour la base martysama0134 v5.8. Si vous utilisez une autre base, quelques ajustements peuvent être nécessaires.
Inclut libcurl.dll (32 bits inclus, version 64 bits disponible)
Toutes les modifications C++ nécessaires sont fournies
Veuillez vous connecter pour télécharger les fichiers Vote4Buff.
Configurez les pools de bonus, les récompenses et les paramètres API
Toute la configuration de Vote4Buff s’effectue dans le fichier char.h de votre serveur. Voici des exemples détaillés pour chaque option.
Commencez par renseigner votre ID serveur et votre token API (disponibles dans votre tableau de bord) :
// 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 !!!
Vous pouvez définir jusqu’à 3 pools de bonus parmi lesquels les joueurs choisiront. Chaque pool peut contenir plusieurs 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
},
};
Bonus courants : 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 et bien d’autres.
Définissez les objets que les joueurs recevront automatiquement après avoir voté :
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
};
Contrôlez le temps de recharge et le coût lorsque les joueurs souhaitent changer de pool sans revoter :
// 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)
Remarque : Après avoir voté, les joueurs peuvent choisir un pool gratuitement. Le délai et le prix ne s’appliquent que s’ils souhaitent changer sans revoter.
Instructions pas à pas pour intégrer Vote4Buff
Sauvegardez vos fichiers client et serveur ! Convention : les fichiers avec le préfixe __ nécessitent une fusion, les autres peuvent être copiés directement.
Ouvrez Source/Server/__char.h depuis le package téléchargé.
class CBuffOnAttributes; et ajoutez le code de configuration juste avant (voir section Configuration)s_VOTE4BUFF_SERVER_ID et s_VOTE4BUFF_API_TOKENbool DragonSoul_RefineWindow_CanRefine(); et ajoutez les déclarations publiques nécessairesIntégrez les fichiers serveur fournis :
__affect.h - Fusionnez les changements avec votre affect.h existant__chat_affect.cpp - Ajoutez la gestion des effets Vote4Buff__cmd_general.cpp - Ajoutez le traitement des commandes__desc_client.cpp - Ajustez le descripteur clientLes fichiers préfixés par __ nécessitent une fusion avec vos propres fichiers.
Compilez votre serveur de jeu avec les nouvelles modifications.
make clean && make
Dans le dossier Client/root/ :
uivote4buff.py dans le dossier root/ de votre client
__constInfo.py__game.py__interfaceModule.py__uiAffectShower.pyClient/ui/game/vote4buff/ vers le répertoire ui/game/ de vos packs
Client/uiscript/vote4buffwindow.py dans votre dossier uiscript
Ajoutez les chaînes de langue depuis Client/locale/ :
__locale_game.txt à votre locale_game.txt
__locale_interface.txt à votre locale_interface.txt
Langues disponibles : EN, DE, ES, PL, TR, RO, IT, PT, HU, GR, CZ
Dans Source/Client/UserInterface/ :
M2WebSocket.cpp et M2WebSocket.h dans le dossier UserInterface
__ à vos fichiers existants
libcurl.dll est présent dans votre dossier client (32 bits fourni, version 64 bits à télécharger si besoin)
Vote4Buff n’ajoute pas de bouton par défaut. Vous devez appeler ToggleVote4Buff() depuis votre interface, par exemple :
Vous pouvez aussi utiliser la classe Vote4BuffButton fournie pour créer une icône déplaçable.
Recompilez votre exécutable client avec les nouvelles modifications.
Testez l’intégration :
Vos joueurs peuvent maintenant voter et recevoir automatiquement leurs récompenses. L’interface Vote4Buff leur indique quand voter, permet de choisir les pools de bonus et affiche les compteurs pour les effets actifs.
La plupart des joueurs découvrent de nouveaux serveurs via les toplists : un outil marketing indispensable
Documentation détaillée et guides pas à pas
Processus d’intégration REST clair et direct
La vérification côté client réduit la charge sur votre serveur
Système éprouvé avec protection anti-fraude intégrée
Assurez-vous que les joueurs ont bien voté avant de distribuer les récompenses
Le flux est clair et intuitif pour les joueurs. La vérification des votes s’effectue via notre API afin de garantir que seuls les votes légitimes sont validés.
Depuis votre site web ou votre interface en jeu
Le joueur est redirigé vers la page de vote de votre serveur sur notre toplist
Il complète le CAPTCHA et soumet son vote
Votre serveur interroge notre API pour vérifier le vote
Votre serveur délivre la récompense en jeu
Choisissez la méthode d’intégration la mieux adaptée à vos besoins :
Solution complète avec UI personnalisée, communication WebSocket et récompenses automatiques.
Créez votre propre implémentation avec notre API REST pour un contrôle total.
Créez un compte et ajoutez votre serveur à notre toplist via https://metin2-toplist.net/servers/create
Retrouvez votre ID serveur et votre token API dans votre tableau de bord. Ils sont nécessaires pour l’authentification.
Téléchargez Vote4Buff pour une solution clé en main ou utilisez notre API pour une implémentation personnalisée.
Testez soigneusement le système de vote avant de le déployer sur votre serveur live.
Si vous utilisez le système Vote4Buff (recommandé), cette API est déjà intégrée ! Cette section s’adresse aux administrateurs souhaitant créer leur propre intégration.
https://metin2-toplist.net/api/check-vote
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
api_token |
string | Oui | Votre token API unique |
ip |
string | Optionnel* | Adresse IP du joueur (IPv4 ou IPv6) |
account_id |
string | Optionnel* | ID de compte ou pseudo du joueur pour un suivi précis |
Pour des résultats optimaux, utilisez <code>account_id</code> afin d’identifier précisément les joueurs. La méthode <code>ip</code> peut être moins fiable si les joueurs utilisent un VPN ou changent de localisation.
Redirigez les joueurs vers le vote avec cette structure d’URL :
https://metin2-toplist.net/vote.{lang}/{server_id}-{server_slug}/{account_id}
Exemples :
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
Langues prises en charge : en, de, es, pl, tr, ro, it, pt, hu, gr, cz
L’API renvoie une réponse JSON avec la structure suivante :
{
"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"
}
| Champ | Type | Description |
|---|---|---|
success |
boolean | Indique si la requête API a réussi |
voted |
boolean | Indique si un vote valide a été trouvé (présent uniquement si success=true) |
last_vote |
string | Horodatage ISO 8601 du dernier vote (présent uniquement si voted=true) |
next_vote_in |
integer | Secondes restantes avant le prochain vote autorisé (uniquement si voted=true) |
message |
string | Message décrivant le résultat |
<?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!');
}
});
Conservez toujours votre token API de manière sécurisée et ne l’exposez jamais côté client. Les requêtes doivent être effectuées depuis votre backend.
Ajoutez un bouton sur votre site ou une commande en jeu qui redirige les joueurs vers la page de vote de votre serveur : https://metin2-toplist.net/servers/YOUR-SERVER-SLUG.
Lorsque le joueur réclame sa récompense (via le site ou en jeu), vérifiez qu’il a voté :
voted vaut true, accordez la récompenseBonnes pratiques recommandées :
Solution : Vérifiez que vous utilisez le token API fourni dans votre tableau de bord et qu’il ne contient pas d’espaces ou caractères en trop.
Causes possibles :
Solution : Assurez-vous que votre serveur peut effectuer des requêtes HTTPS sortantes. Vérifiez votre pare-feu et implémentez une logique de nouvelle tentative avec backoff exponentiel.
Solution : Conservez un suivi local des votes récompensés et ne distribuez chaque vote qu’une seule fois.
Solution : Envoyez l’adresse IPv6 complète. Notre API accepte IPv4 et IPv6.
Testez votre intégration en profondeur avec un compte de test avant de la déployer en production. Gérez tous les cas limites et scénarios d’erreur.