Entdecke die besten Metin2 Private Server. Stimme für deine Lieblingsserver ab, erkunde neue Communities und finde dein nächstes Gaming-Abenteuer.
Einfach, kostenlos & zuverlässig – Belohnungen für Stimmen auf deinem Metin2-Privatserver
Unser Vote-Verification-System ist eine moderne, speziell für Metin2-Privatserver entwickelte Lösung. Spieler können für ihren Lieblingsserver abstimmen und erhalten gleichzeitig Ingame-Vorteile.
Das System ist sowohl leicht zu implementieren als auch äußerst zuverlässig – ideal für Serverbetreiber, die Spielerbindung und Sichtbarkeit erhöhen möchten.
Unser Ziel ist ein Win-win für Spieler und Serverbetreiber. Spieler werden für ihre Treue belohnt, während Server mehr Sichtbarkeit und Aktivität erhalten.
Komplettes Ingame-Voting- und Belohnungssystem mit individueller UI
Vote4Buff ist unsere Premium All-in-One Voting-Lösung mit moderner Ingame-UI, WebSocket-Kommunikation und vollständiger Serverintegration. Spieler stimmen ab, wählen Bonus-Pools und erhalten sofort Belohnungen – ohne das Spiel zu verlassen!
Das Vote4Buff-System besteht aus drei Hauptkomponenten:
Perfekt für: Serverbetreiber, die eine professionelle Plug-and-Play-Lösung wünschen, ohne Wochen in Eigenentwicklung zu investieren. Bonus-Pools konfigurieren, Dateien integrieren – fertig!
Alle Dateien für die Client- und Serverintegration
Vote4Buff wurde für die Source-Basis martysama0134 v5.8 entwickelt. Bei anderen Quellen können Anpassungen erforderlich sein.
Enthält libcurl.dll (32-Bit enthalten, 64-Bit verfügbar)
Alle notwendigen C++-Quellcodeanpassungen inklusive
Bitte anmelden, um Vote4Buff-Dateien herunterzuladen.
Bonus-Pools, Item-Belohnungen und API-Einstellungen konfigurieren
Die komplette Vote4Buff-Konfiguration erfolgt in der Datei char.h auf deinem Server. Nachfolgend findest du Beispiele für alle Optionen.
Trage deine Server-ID und deinen API-Token (im Dashboard zu finden) ein:
// 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 !!!
Definiere bis zu 3 Bonus-Pools, aus denen Spieler auswählen können. Jeder Pool kann mehrere Boni enthalten:
// 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
},
};
Beliebte Bonus-Typen: 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 und viele mehr!
Lege Items fest, die Spieler automatisch beim Abstimmen erhalten:
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
};
Bestimme Abklingzeit und Preis, wenn Spieler zwischen Bonus-Pools wechseln möchten:
// 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)
Hinweis: Nach einer Stimme können Spieler kostenlos einen Bonus-Pool wählen. Cooldown und Preis gelten nur, wenn sie später ohne erneute Stimme wechseln möchten.
Schritt-für-Schritt-Anleitung zur Integration von Vote4Buff
Erstelle Backups deiner Client- und Serverdateien! Dateinamen mit __ müssen gemerged werden, Dateien ohne Präfix können direkt übernommen werden.
Öffne Source/Server/__char.h aus dem Download-Paket.
class CBuffOnAttributes; und füge die Konfiguration darüber ein (siehe Konfigurationskapitel)s_VOTE4BUFF_SERVER_ID und s_VOTE4BUFF_API_TOKENbool DragonSoul_RefineWindow_CanRefine(); und ergänze die öffentlichen MethodendeklarationenIntegriere die Serverdateien aus dem Paket:
__affect.h – übernimm die Änderungen in deine bestehende affect.h__chat_affect.cpp – Vote4Buff-Affect-Logik hinzufügen__cmd_general.cpp – Befehlsverarbeitung ergänzen__desc_client.cpp – Client-Descriptor anpassenDateien mit __ im Namen müssen mit deinen vorhandenen Dateien zusammengeführt werden.
Kompiliere deinen Game-Server mit den neuen Anpassungen.
make clean && make
Im Ordner Client/root/:
uivote4buff.py in den root/-Ordner deines Clients
__constInfo.py__game.py__interfaceModule.py__uiAffectShower.pyClient/ui/game/vote4buff/ in dein Pack-Verzeichnis ui/game/
Client/uiscript/vote4buffwindow.py in den uiscript-Ordner
Füge die Sprachtexte aus Client/locale/ hinzu:
__locale_game.txt an deine locale_game.txt an
__locale_interface.txt an deine locale_interface.txt an
Verfügbare Sprachen: EN, DE, ES, PL, TR, RO, IT, PT, HU, GR, CZ
Im Ordner Source/Client/UserInterface/:
M2WebSocket.cpp und M2WebSocket.h in den UserInterface-Ordner
__-Präfix in deine bestehenden Dateien
libcurl.dll im Client-Verzeichnis liegt (32-Bit enthalten, 64-Bit ggf. herunterladen)
Vote4Buff erstellt keinen Standardbutton. Du musst ToggleVote4Buff() an einer passenden Stelle aufrufen. Zum Beispiel:
Oder verwende die enthaltene Vote4BuffButton-Klasse für ein verschiebbares Icon.
Kompiliere deinen Client mit den neuen Anpassungen.
Teste die Integration:
Deine Spieler können jetzt abstimmen und automatisch Belohnungen erhalten. Die Vote4Buff-UI zeigt verfügbare Stimmen, Bonus-Auswahl und Countdown-Timer für aktive Effekte an.
Die meisten neuen Spieler finden Server über Toplisten – ein unverzichtbares Marketing-Tool
Ausführliche Dokumentation und Schritt-für-Schritt-Anleitungen
Einfacher REST-API-Workflow ohne tiefen Code-Eingriff
Vote-Prüfung belastet deinen Server kaum
Bewährtes System mit integriertem Betrugsschutz
Belohnungen nur nach bestätigter Stimme
Der Ablauf ist für Spieler klar und einfach. Die Stimmenprüfung erfolgt über unsere API, damit nur echte Stimmen belohnt werden.
Auf deiner Webseite oder in der Ingame-Oberfläche
Der Spieler landet auf deiner Server-Seite in unserer Topliste
Captcha lösen und Stimme abschicken
Dein Server prüft die Stimme über unsere API
Dein Server vergibt die Ingame-Belohnung
Wähle die Integrationsmethode, die zu dir passt:
Komplettlösung mit eigener UI, WebSocket-Kommunikation und automatischer Belohnung.
Baue deine eigene Umsetzung mit unserer REST-API für maximale Flexibilität.
Erstelle ein Konto und füge deinen Server in unserer Topliste hinzu: https://metin2-toplist.net/servers/create
Im Server-Dashboard findest du deine Server-ID und deinen API-Token. Beide werden für die Authentifizierung benötigt.
Lade Vote4Buff für eine fertige Lösung herunter oder nutze die API für eine eigene Umsetzung.
Teste das Votingsystem gründlich und veröffentliche es anschließend auf deinem Liveserver.
Wenn du das Vote4Buff-System verwendest (empfohlen), ist diese API bereits integriert! Dieser Abschnitt richtet sich an Serverbetreiber, die eine eigene Umsetzung bauen möchten.
https://metin2-toplist.net/api/check-vote
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
api_token |
string | Ja | Dein eindeutiger API-Token |
ip |
string | Optional* | IP-Adresse des Spielers (IPv4 oder IPv6) |
account_id |
string | Optional* | Account-ID/Username des Spielers für genaue Zuordnung |
Für bestmögliche Ergebnisse verwende <code>account_id</code>, um Spieler eindeutig zu erkennen. Die <code>ip</code>-Variante kann ungenauer sein, wenn Spieler VPNs nutzen oder an unterschiedlichen Orten spielen.
Leite Spieler mit dieser URL-Struktur zur Voting-Seite weiter:
https://metin2-toplist.net/vote.{lang}/{server_id}-{server_slug}/{account_id}
Beispiele:
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
Unterstützte Sprachen: en, de, es, pl, tr, ro, it, pt, hu, gr, cz
Die API liefert eine JSON-Antwort mit folgendem Aufbau:
{
"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"
}
| Feld | Typ | Beschreibung |
|---|---|---|
success |
boolean | Gibt an, ob die Anfrage erfolgreich war |
voted |
boolean | Gibt an, ob eine gültige Stimme gefunden wurde (nur bei success=true) |
last_vote |
string | ISO-8601-Zeitstempel der letzten Stimme (nur bei voted=true) |
next_vote_in |
integer | Sekunden bis zur nächsten möglichen Stimme (nur bei voted=true) |
message |
string | Beschreibung des Ergebnisses in Klartext |
<?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!');
}
});
Bewahre deinen API-Token sicher auf und veröffentliche ihn niemals im Client. API-Aufrufe sollten immer über deinen Server erfolgen.
Füge auf deiner Webseite oder im Spiel einen Button bzw. Befehl hinzu, der Spieler auf deine Voting-Seite unter https://metin2-toplist.net/servers/YOUR-SERVER-SLUG führt.
Wenn ein Spieler seine Belohnung anfordert, prüfe, ob er bereits abgestimmt hat:
voted = true Belohnung vergebenBest Practices für die Belohnungsvergabe:
Lösung: Stelle sicher, dass du den korrekten API-Token aus deinem Dashboard verwendest. Achte auf Leerzeichen oder zusätzliche Zeichen.
Mögliche Ursachen:
Lösung: Stelle sicher, dass dein Server ausgehende HTTPS-Anfragen senden kann. Firewall prüfen und Retry-Logik mit Backoff implementieren.
Lösung: Verwalte lokal, welche Stimmen bereits belohnt wurden, damit jede Stimme nur einmal vergütet wird.
Lösung: Stelle sicher, dass die vollständige IPv6-Adresse übertragen wird. Unsere API unterstützt IPv4 und IPv6.
Teste deine Integration ausführlich mit einem Testaccount, bevor du live gehst. Berücksichtige alle Sonderfälle und Fehlerzustände.