Fedezd fel a legjobb Metin2 privát szervereket. Szavazz a kedvenceidre, fedezz fel új közösségeket, és találd meg a következő játékos kalandodat.
Könnyen használható, megbízható szavazási jutalmak a Metin2 privát szerveredhez
A szavazás ellenőrző rendszerünk egy modern és innovatív megoldás, amelyet kifejezetten Metin2 privát szerverek számára terveztünk. Élvezetes módot kínál a játékosoknak, hogy kedvenc szerverükre szavazzanak, miközben játékbeli előnyöket kapnak.
A rendszer könnyen bevezethető és rendkívül megbízható, így ideális választás azoknak a szerver tulajdonosoknak, akik növelni szeretnék a játékosok elköteleződését és a szerver láthatóságát.
Célunk egy mindenki számára előnyös helyzet megteremtése: a játékosok hűségükért játékbeli jutalmat kapnak, a szerverek pedig nagyobb láthatóságot és aktivitást élveznek.
Teljes körű szavazási és jutalmazási rendszer egyedi játékbeli felülettel
A Vote4Buff egy prémium, mindent egyben szavazási megoldás, amely látványos játékbeli felületet, WebSocket kommunikációt és teljes szerver integrációt biztosít. A játékosok szavazhatnak, több bónuszcsomag közül választhatnak, és azonnali jutalmat kapnak anélkül, hogy elhagynák a játékot!
A Vote4Buff rendszer három fő komponensből áll:
Tökéletes azoknak: akik professzionális, azonnal használható megoldást szeretnének anélkül, hogy heteket töltenének egyedi fejlesztéssel. Csak konfiguráld a bónuszcsomagokat, illeszd be a fájlokat, és már kész is!
Szerezd be az összes szükséges fájlt a kliens és a szerver integrációhoz
A Vote4Buff a martysama0134 v5.8 forrásbázishoz készült. Ha más forrást használsz, előfordulhat, hogy további módosításokra van szükség.
Tartalmazza a libcurl.dll fájlt (32 bites verzió mellékelve, 64 bites elérhető)
Minden szükséges C++ forrás módosítás megtalálható a csomagban
Kérjük, jelentkezz be a Vote4Buff fájlok letöltéséhez.
Állítsd be a bónuszcsomagokat, tárgyjutalmakat és az API beállításokat
A Vote4Buff konfigurációja a szervered char.h fájljában történik. Az alábbiakban részletes példákat találsz minden beállításra.
Először állítsd be a szerver azonosítót és az API tokent (mindkettő megtalálható a vezérlőpultodon):
// 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 !!!
Legfeljebb 3 bónuszcsomagot definiálhatsz, amelyek közül a játékosok választhatnak. Minden csomag több bónuszt is tartalmazhat:
// 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
},
};
Gyakori bónusz típusok: 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 és még sok más!
Állítsd be azokat a tárgyakat, amelyeket a játékosok automatikusan megkapnak szavazás utá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
};
Szabályozd a várakozási időt és a költségeket, ha a játékosok bónuszcsomagot szeretnének váltani:
// 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)
Megjegyzés: A szavazás után a játékosok ingyenesen választhatnak bónuszcsomagot. A várakozási idő és a költség csak akkor érvényes, ha szavazás nélkül szeretnének csomagot váltani.
Lépésről lépésre útmutató a Vote4Buff integrálásához
Készíts biztonsági másolatot a kliens és szerver fájljaidról! A __ előtaggal rendelkező fájlokat módosítani kell, a többi közvetlenül másolható.
Nyisd meg a letöltött csomag Source/Server/__char.h fájlját.
class CBuffOnAttributes; sort, és illeszd be fölé a konfigurációs kódot (lásd Konfiguráció fejezet)s_VOTE4BUFF_SERVER_ID és s_VOTE4BUFF_API_TOKEN értékeketbool DragonSoul_RefineWindow_CanRefine(); sort, és add hozzá a nyilvános metódus deklarációkatIlleszd be a csomag szerver oldali fájljait:
__affect.h - Egészítsd ki a meglévő affect.h fájlodat a biztosított változtatásokkal__chat_affect.cpp - Add hozzá a Vote4Buff hatáskezelést__cmd_general.cpp - Egészítsd ki a parancs feldolgozást__desc_client.cpp - Kliens deskriptor módosításokMegjegyzés: A __ előtaggal ellátott fájlok azt jelzik, hogy a módosításokat a saját fájljaiddal kell egyesíteni.
Fordítsd újra a játékszervert az új módosításokkal.
make clean && make
A Client/root/ mappából:
uivote4buff.py fájlt a kliensed root/ mappájába
__constInfo.py__game.py__interfaceModule.py__uiAffectShower.pyClient/ui/game/vote4buff/ mappát a pack ui/game/ könyvtárába
Client/uiscript/vote4buffwindow.py fájlt az uiscript mappába
Add hozzá a támogatott nyelvekhez tartozó szövegeket a Client/locale/ mappából:
__locale_game.txt tartalmát a locale_game.txt fájlba
__locale_interface.txt tartalmát a locale_interface.txt fájlba
Elérhető nyelvek: EN, DE, ES, PL, TR, RO, IT, PT, HU, GR, CZ
A Source/Client/UserInterface/ könyvtárból:
M2WebSocket.cpp és M2WebSocket.h fájlokat az UserInterface mappába
__ előtagú fájlokban található változtatásokat a saját fájljaidra
libcurl.dll megtalálható a kliensed könyvtárában (a 32 bites verzió mellékelve, szükség esetén töltsd le a 64 bites változatot)
A Vote4Buff alapból nem ad hozzá gombot. Neked kell meghívni a ToggleVote4Buff() függvényt valahonnan a felületedről. Például:
Használhatod a mellékelt Vote4BuffButton osztályt is, amely egy mozgatható ikon gombot hoz létre
Fordítsd újra a kliens futtatható állományát az új módosításokkal.
Teszteld az integrációt:
A játékosaid mostantól automatikusan szavazhatnak és jutalmat kaphatnak. A Vote4Buff felület megmutatja, mikor szavazhatnak, bónuszcsomagot választhatnak, és visszaszámolót jelenít meg az aktív hatásokhoz.
Az új játékosok többsége toplistákon keresztül talál szervert, így ez létfontosságú marketing eszköz
Részletes dokumentáció és lépésről lépésre útmutatók teszik gyerekjátékká a beállítást
Egyszerű REST API integrációs folyamat
A kliens oldali szavazás ellenőrzés minimális szerverterhelést biztosít
Éles környezetben bizonyított rendszer beépített csalás elleni védelemmel
Győződj meg róla, hogy a játékosok valóban szavaztak, mielőtt jutalmat adnál
A rendszer tiszta és intuitív folyamatot követ, amit a játékosok könnyen megértenek. A szavazás ellenőrzése az API-nkon keresztül történik, így biztos lehetsz benne, hogy valós szavazásokat hitelesítesz!
A weboldaladról vagy a játékbeli felületről
A játékost a toplistán lévő szavazási oldaladra irányítjuk
A játékos kitölti a CAPTCHA-t és elküldi a szavazatát
A szervered lekérdezi az API-nkat a szavazás ellenőrzéséhez
A szervered kiosztja a játékbeli jutalmat
Válaszd ki az igényeidnek megfelelő integrációs módszert:
Teljes körű, egyedi játékbeli felületet, WebSocket kommunikációt és automatikus jutalmazást kínáló megoldás.
Építs saját megoldást a REST API-nk segítségével a maximális rugalmasságért.
Hozz létre egy fiókot, és add hozzá a szervered a toplistához itt: https://metin2-toplist.net/servers/create
A szerver azonosítót és az API tokent a szerver vezérlőpultján találod. Ezek szükségesek a hitelesítéshez.
Töltsd le a Vote4Buffot egy kész megoldáshoz, vagy építs egyedi integrációt az API segítségével.
Teszteld alaposan a szavazási rendszert, majd élesítsd az éles szerveren.
Ha a Vote4Buff rendszert használod (ajánlott), akkor ez az API már integálva van! Ez a szakasz azoknak szól, akik saját megoldást szeretnének építeni.
https://metin2-toplist.net/api/check-vote
| Paraméter | Típus | Kötelező | Leírás |
|---|---|---|---|
api_token |
string | Igen | A szervered egyedi API tokene |
ip |
string | Opcionális* | A játékos IP címe (IPv4 vagy IPv6) |
account_id |
string | Opcionális* | A játékos fiókazonosítója/felhasználóneve a pontosabb követéshez |
A legjobb eredmény érdekében használd az <code>account_id</code> paramétert a játékosok pontos azonosításához. Az <code>ip</code> kevésbé megbízható, ha a játékosok VPN-t használnak vagy több helyről játszanak.
Így irányítsd a játékosokat a szavazáshoz:
https://metin2-toplist.net/vote.{lang}/{server_id}-{server_slug}/{account_id}
Példák:
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
Támogatott nyelvek: en, de, es, pl, tr, ro, it, pt, hu, gr, cz
Az API a következő struktúrájú JSON választ adja vissza:
{
"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"
}
| Mező | Típus | Leírás |
|---|---|---|
success |
boolean | Jelzi, hogy az API kérés sikeresen feldolgozásra került-e |
voted |
boolean | Jelzi, hogy található-e érvényes szavazás (csak akkor, ha success=true) |
last_vote |
string | Az utolsó szavazás ISO 8601 időbélyege (csak ha voted=true) |
next_vote_in |
integer | Másodpercek száma a következő engedélyezett szavazásig (csak ha voted=true) |
message |
string | Érthető üzenet, amely leírja az eredményt |
<?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!');
}
});
Az API tokent mindig biztonságosan tárold, és soha ne tedd elérhetővé kliens oldalon. Az API hívásokat kizárólag a szervered backendjéről végezd.
Adj hozzá egy szavazó gombot a weboldaladra vagy egy játékbeli parancsot, amely https://metin2-toplist.net/servers/YOUR-SERVER-SLUG címre irányítja a játékosokat.
Amikor a játékos igényli a jutalmat (weben vagy a játékban), ellenőrizd, hogy szavazott-e:
voted értéke true, add oda a jutalmatAjánlott gyakorlatok a jutalmak kezeléséhez:
Megoldás: Ellenőrizd, hogy a vezérlőpultról származó megfelelő API tokent használod-e. Győződj meg arról, hogy nincs benne extra szóköz vagy karakter.
Lehetséges okok:
Megoldás: Győződj meg róla, hogy a szervered képes HTTPS kéréseket indítani. Ellenőrizd a tűzfal beállításokat. Vezess be újrapróbálkozást exponenciális backoff-fal.
Megoldás: Vezess helyi nyilvántartást a jutalmazott szavazásokról. Tárold a szavazás időbélyegét, és egyszer add oda a jutalmat.
Megoldás: Győződj meg róla, hogy a teljes IPv6 címet küldöd el. Az API támogatja az IPv4-et és az IPv6-ot is.
Teszteld alaposan az integrációt egy teszt fiókkal, mielőtt élesíted. Kezeld minden szélsőséges esetet és hibát.