En iyi Metin2 özel sunucularını keşfet. Favorilerine oy ver, yeni topluluklar keşfet ve bir sonraki oyun maceranı bul.
Metin2 özel sunucunuz için kolay, ücretsiz ve güvenilir oy ödülleri
Oy Doğrulama Sistemimiz, Metin2 özel sunucuları için özel olarak tasarlanmış modern ve yenilikçi bir çözümdür. Oyunculara favori sunucularına oy verirken oyun içi avantajlar kazandıran etkileşimli bir yol sunar.
Sistem hem uygulaması kolay hem de son derece güvenilirdir; bu nedenle oyuncu etkileşimini ve sunucu görünürlüğünü artırmak isteyen sunucu sahipleri için mükemmel bir seçimdir.
Amacımız herkes için kazançlı bir deneyim sunmaktır: oyuncular sadakatleri için oyun içi ödüller alır, sunucular ise daha fazla görünürlük ve etkileşim elde eder.
Özel oyun içi arayüze sahip eksiksiz oy ve ödül sistemi
Vote4Buff, premium, her şey dahil oy çözümümüzdür. Şık bir oyun içi arayüz, WebSocket iletişimi ve tam sunucu entegrasyonu sunar. Oyuncular oy verebilir, birden fazla bonus havuzu arasından seçim yapabilir ve oyundan çıkmadan anında ödül alabilir!
Vote4Buff sistemi üç ana bileşenden oluşur:
Şunlar için idealdir: Profesyonel, kullanıma hazır bir çözüm arayan, haftalarca özel geliştirme yapmak istemeyen sunucu sahipleri. Bonus havuzlarını yapılandırın, dosyaları entegre edin ve hazırsınız!
İstemci ve sunucu entegrasyonu için gereken tüm dosyaları edinin
Vote4Buff, martysama0134 v5.8 kaynak tabanı için tasarlanmıştır. Farklı bir kaynak kullanıyorsanız ek uyarlamalar gerekebilir.
libcurl.dll içerir (32-bit sürüm dahil, 64-bit sürümü mevcuttur)
Gerekli tüm C++ kaynak güncellemeleri pakete dahil edilmiştir
Vote4Buff dosyalarını indirmek için lütfen giriş yapın.
Bonus havuzlarını, eşya ödüllerini ve API ayarlarını yapılandırın
Vote4Buff yapılandırmasının tamamı sunucunuzdaki char.h dosyasında yapılır. Aşağıda her ayar için detaylı örnekler bulabilirsiniz.
Önce sunucu ID’nizi ve API tokenınızı yapılandırın (sunucu panelinizde bulabilirsiniz):
// 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 !!!
En fazla 3 bonus havuzu tanımlayabilirsiniz. Oyuncular bu havuzlardan dilediklerini seçebilir; her havuzda birden fazla bonus bulunabilir:
// 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
},
};
Sık kullanılan bonus tipleri: 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 ve daha fazlası!
Oyuncuların oy sonrası otomatik olarak alacağı eşyaları yapılandırı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
};
Oyuncular bonus havuzunu değiştirmek istediğinde bekleme süresini ve maliyeti kontrol edin:
// 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)
Not: Oy verdikten sonra oyuncular bir bonus havuzunu ücretsiz seçebilir. Bekleme süresi ve ücret yalnızca oy vermeden havuz değiştirmek istediklerinde uygulanır.
Vote4Buff entegrasyonu için adım adım talimatlar
İstemci ve sunucu dosyalarınızın yedeğini alın! __ öneki bulunan dosyalar birleştirme gerektirir, diğerleri doğrudan kopyalanabilir.
İndirdiğiniz paketteki Source/Server/__char.h dosyasını açın.
class CBuffOnAttributes; satırını bulun ve üstüne yapılandırma kodunu ekleyin (Konfigürasyon bölümüne bakın)s_VOTE4BUFF_SERVER_ID ve s_VOTE4BUFF_API_TOKEN değerlerini ayarlayınbool DragonSoul_RefineWindow_CanRefine(); satırını bulun ve gerekli public metod bildirimlerini ekleyinPaketteki sunucu dosyalarını entegrasyon için kullanın:
__affect.h - Mevcut affect.h dosyanızı sağlanan değişikliklerle güncelleyin__chat_affect.cpp - Vote4Buff etki yönetimini ekleyin__cmd_general.cpp - Komut işleme güncellemelerini ekleyin__desc_client.cpp - İstemci tanımlayıcı değişikliklerini uygulayınNot: __ önekli dosyalar mevcut dosyalarınıza birleştirilmelidir.
Sunucuyu yeni değişikliklerle derleyin.
make clean && make
Client/root/ klasöründen:
uivote4buff.py dosyasını istemci root/ klasörüne kopyalayın
__constInfo.py__game.py__interfaceModule.py__uiAffectShower.pyClient/ui/game/vote4buff/ klasörünü pack’inizdeki ui/game/ klasörüne kopyalayın
Client/uiscript/vote4buffwindow.py dosyasını uiscript klasörüne kopyalayın
Client/locale/ klasöründen desteklenen diller için metinleri ekleyin:
__locale_game.txt içeriğini locale_game.txt dosyanıza ekleyin
__locale_interface.txt içeriğini locale_interface.txt dosyanıza ekleyin
Desteklenen diller: EN, DE, ES, PL, TR, RO, IT, PT, HU, GR, CZ
Source/Client/UserInterface/ klasöründen:
M2WebSocket.cpp ve M2WebSocket.h dosyalarını UserInterface klasörüne kopyalayın
__ önekli dosyalardaki değişiklikleri kendi dosyalarınıza uygulayın
libcurl.dll dosyasının istemci klasöründe olduğundan emin olun (32-bit sürüm dahil, 64-bit sürümü gerekirse indirin)
Vote4Buff varsayılan bir buton eklemez. Arayüzünüzden ToggleVote4Buff() fonksiyonunu çağırmanız gerekir. Örneğin:
Sürüklenebilir bir simge butonu oluşturan Vote4BuffButton sınıfını da kullanabilirsiniz
Yeni değişikliklerle istemci yürütülebilir dosyasını yeniden derleyin.
Entegrasyonu test edin:
Artık oyuncularınız oy verebilir ve otomatik olarak ödül alabilir. Vote4Buff arayüzü, oy verebilecekleri zamanı gösterir, bonus havuzu seçmelerine izin verir ve aktif etkiler için geri sayım sunar.
Yeni oyuncuların çoğu sunucuları toplistlerden keşfeder; bu nedenle bu güçlü bir pazarlama aracıdır
Detaylı dokümantasyon ve adım adım rehberler kurulumu çok kolaylaştırır
Basit REST API entegrasyon süreci
Oy doğrulamasının istemci tarafında yapılması sunucu yükünü minimumda tutar
Yerleşik sahtekarlık önleme ile kanıtlanmış sistem
Ödül vermeden önce oyuncuların gerçekten oy verdiğinden emin olun
Sistem oyuncuların kolayca anlayabileceği temiz ve sezgisel bir akış sunar. Oy doğrulaması API’miz üzerinden gerçekleştiği için gerçek oyları ödüllendirdiğinizden emin olabilirsiniz!
Web sitenizden veya oyun içi arayüzden
Oyuncu toplistteki sunucu oy sayfanıza yönlendirilir
Oyuncu CAPTCHA’yı tamamlar ve oyunu gönderir
Sunucunuz oy doğrulaması için API’mize istek gönderir
Sunucunuz oyuncuya oyun içi ödül verir
İhtiyaçlarınıza en uygun entegrasyon yöntemini seçin:
Özel arayüz, WebSocket iletişimi ve otomatik ödül sistemi içeren eksiksiz çözüm.
Maksimum esneklik için REST API’mizi kullanarak kendi çözümünüzü oluşturun.
https://metin2-toplist.net/servers/create adresinden hesap oluşturup sunucunuzu toplistemize ekleyin
Sunucu ID’niz ve API tokenınız sunucu panelinizde bulunur. Yetkilendirme için gereklidir.
Hazır çözüm için Vote4Buff’u indirin veya API ile özel entegrasyon geliştirin.
Oy sistemini kapsamlı şekilde test edin, ardından canlı sunucunuzda yayınlayın.
Vote4Buff sistemini (önerilir) kullanıyorsanız, bu API zaten entegredir! Bu bölüm, kendi uygulamasını geliştirmek isteyen sunucu sahipleri içindir.
https://metin2-toplist.net/api/check-vote
| Parametre | Tip | Gerekli | Açıklama |
|---|---|---|---|
api_token |
string | Evet | Sunucunuza ait benzersiz API token |
ip |
string | Opsiyonel* | Oyuncunun IP adresi (IPv4 veya IPv6) |
account_id |
string | Opsiyonel* | Oyuncunun hesap ID’si/kullanıcı adı (daha doğru takip için) |
En iyi sonuç için <code>account_id</code> parametresini kullanarak oyuncuları daha kesin şekilde takip edin. <code>ip</code> yöntemi, oyuncular VPN kullandığında veya farklı konumlardan bağlandığında daha az güvenilir olabilir.
Oyuncuları şu URL formatıyla oy sayfasına yönlendirin:
https://metin2-toplist.net/vote.{lang}/{server_id}-{server_slug}/{account_id}
Örnekler:
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
Desteklenen diller: en, de, es, pl, tr, ro, it, pt, hu, gr, cz
API aşağıdaki yapıda bir JSON yanıtı döndürür:
{
"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"
}
| Alan | Tip | Açıklama |
|---|---|---|
success |
boolean | API isteğinin başarıyla işlenip işlenmediğini belirtir |
voted |
boolean | Geçerli bir oy bulunup bulunmadığını gösterir (yalnızca success=true ise) |
last_vote |
string | Son oy tarihinin ISO 8601 zaman damgası (yalnızca voted=true ise) |
next_vote_in |
integer | Bir sonraki oya kadar kalan saniye sayısı (yalnızca voted=true ise) |
message |
string | Sonucu açıklayan anlaşılır mesaj |
<?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!');
}
});
API tokenınızı güvenli şekilde saklayın ve asla istemci tarafı kodda göstermeyin. API çağrılarını daima sunucu backend’inizden yapın.
Web sitenize veya oyununuza https://metin2-toplist.net/servers/YOUR-SERVER-SLUG adresine yönlendiren bir oy butonu ya da komut ekleyin.
Oyuncu ödül talep ettiğinde (site üzerinden veya oyun içi komutla) şu adımları izleyin:
voted true ise ödülü verinÖdül sürecini yönetmek için en iyi uygulamalar:
Çözüm: Sunucu panelinizden aldığınız doğru API tokenını kullandığınızdan emin olun. Fazladan boşluk veya karakter olmadığını kontrol edin.
Olası nedenler:
Çözüm: Sunucunuzun HTTPS istekleri gönderebildiğinden emin olun. Güvenlik duvarı ayarlarını kontrol edin. Üstel backoff ile yeniden deneme mantığı uygulayın.
Çözüm: Ödüllendirilen oyları yerel olarak takip edin. Oy zaman damgasını saklayın ve her oy için ödülü sadece bir kez verin.
Çözüm: Tam IPv6 adresini gönderdiğinizden emin olun. API’miz hem IPv4 hem de IPv6 destekler.
Canlıya almadan önce entegrasyonu bir test hesabıyla kapsamlı şekilde deneyin. Tüm uç durumları ve hata senaryolarını yönettiğinizden emin olun.