- Mesaj
- 78
- Çözümler
- 4
- Beğeni
- 100
- Puan
- 689
- Ticaret Puanı
- 0
Merhaba arkadaşlar. Basit bir whitelist sistemiyle karşınızdayım. Aslında oyun içinde bir şeylerin test edilmesi gerektiğinde sadece GM'lerin giriş yapmasına izin verecek bir şey düşünmüştüm, sonra daha basit olsun diye hesap IDsi ile kontrol sağlayayım dedim. Bir Metin2 sunucusunda whitelist olayı ne kadar lüzumlu olur, ne sebeple kullanılır bilemiyorum. Fakat hazır yapmışken belki birinin işine yarar diye paylaşıyorum 
NOT: Windows Altyapı Server Files üzerinde çalıştırdım. BSD için ufak değişiklikler yapılması gerekebilir.
Oyuna giriş yapılırken Whitelist tablosunda girilen ID'yi arar, tabloda yoksa "Hesabınız whitelist'te tanımlı değil." uyarısı verir ve girişe engel olur.
Server / game src:
Client (pack):
Kullanım:
Sabit olsun istiyorsanız kanalların CONFIG dosyalarında WHITE_LIST: 1 tokeniyle aktive edebilirsiniz.
Aynı zamanda oyun içinde de GM karakterle /whitelist 1 veya /whitelist 0 komutlarıyla aktive edebilir veya devre dışı bırakabilirsiniz.
Veritabanı common içinde, yukardaki sql dosyasında okuttuğumuz whitelist tablosuna istediğiniz ID'yi ekleyip oyuna giriş izni verebilirsiniz.
Oyun içinde de /addwhitelist kullanıcı_id komutuyla whitelist tablosuna ID ekleyebilirsiniz.

NOT: Windows Altyapı Server Files üzerinde çalıştırdım. BSD için ufak değişiklikler yapılması gerekebilir.
Oyuna giriş yapılırken Whitelist tablosunda girilen ID'yi arar, tabloda yoksa "Hesabınız whitelist'te tanımlı değil." uyarısı verir ve girişe engel olur.
whitelist.sql:
/*
Navicat Premium Data Transfer
Source Server : winMT2
Source Server Type : MySQL
Source Server Version : 50626 (5.6.26-log)
Source Host : localhost:3306
Source Schema : common
Target Server Type : MySQL
Target Server Version : 50626 (5.6.26-log)
File Encoding : 65001
Date: 18/03/2024 17:30:22
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for whitelist
-- ----------------------------
DROP TABLE IF EXISTS `whitelist`;
CREATE TABLE `whitelist` (
`login` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;
Server / game src:
cmd.cpp
cmd_gm.cpp
config.cpp
input_login.cpp
service.h
cmd.cpp:
//ACMD'lerin tanımlandığı yere bunu ekle:
#ifdef WHITELIST
ACMD(do_whitelist);
ACMD(do_add_to_whitelist);
#endif
//bu satırı bul:
{ "!RESERVED!", NULL, 0, POS_DEAD, GM_IMPLEMENTOR },
//altına bunu ekle:
#ifdef WHITELIST
{ "whitelist", do_whitelist, 0, POS_DEAD, GM_IMPLEMENTOR },
{ "addwhitelist", do_add_to_whitelist, 0, POS_DEAD, GM_IMPLEMENTOR },
#endif
cmd_gm.cpp
cmd_gm.cpp:
//#include tanımlamalarının bittiği yere bunu ekle:
#ifdef WHITELIST
extern int g_whiteList;
#endif
//ACMD fonksiyonlarının tanımlandığı bölümde herhangi bir yere ekle:
// (benimki ACMD(do_pcbang_update) {} 'in altında. )
#ifdef WHITELIST
ACMD(do_whitelist)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
if (ch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /whitelist 1 veya 0");
}
}
else if (std::string(arg1) != "1" && std::string(arg1) != "0")
{
if (ch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /whitelist 1 veya 0");
}
}
else
{
if (std::string(arg1) == "1")
{
g_whiteList = true;
if(ch){ ch->ChatPacket(CHAT_TYPE_INFO, "Whitelist aktive edildi."); }
}
else if (std::string(arg1) == "0")
{
g_whiteList = false;
if (ch) { ch->ChatPacket(CHAT_TYPE_INFO, "Whitelist devre disi birakildi."); }
}
}
}
ACMD(do_add_to_whitelist)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
if (ch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /addwhitelist KULLANICI_ID");
}
}
else
{
const char* login = arg1;
char szQuery[512];
snprintf(szQuery, sizeof(szQuery), "SELECT login FROM account.account%s WHERE login='%s'", get_table_postfix(), login);
std::unique_ptr<SQLMsg> pMsg(AccountDB::instance().DirectQuery(szQuery));
if (pMsg->Get()->uiNumRows > 0)
{
snprintf(szQuery, sizeof(szQuery), "SELECT login FROM common.whitelist WHERE login='%s'", login);
std::unique_ptr<SQLMsg> pMsg2(AccountDB::instance().DirectQuery(szQuery));
if (pMsg2->Get()->uiNumRows > 0)
{
if (ch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Bu ID zaten Whitelist'te mevcut.");
}
}
else
{
snprintf(szQuery, sizeof(szQuery), "INSERT INTO common.whitelist VALUES ('%s')", login);
std::unique_ptr<SQLMsg> pMsg3(AccountDB::instance().DirectQuery(szQuery));
if (pMsg3) {
if (ch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "ID Whitelist'e eklendi!");
}
}
}
}
else
{
if (ch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Account tablosunda boyle bir ID bulunamadi.");
}
}
}
}
#endif
config.cpp
config.cpp:
//#include'ların tanımlandığı yer bittikten sonra bunu ekle:
#ifdef WHITELIST
BOOL g_whiteList = false;
#endif
//sayfada bulunan en son TOKEN("...."){...} tanımlamasını bul ve hemen altına ekle:
#ifdef WHITELIST
TOKEN("white_list")
{
//fprintf(stderr, "WHITELIST: %s\n", value_string);
sys_log(0, "WHITELIST: %s\n", value_string);
int tmp = 0;
str_to_number(tmp, value_string);
if (0 == tmp)
g_whiteList = false;
else
g_whiteList = true;
continue;
}
#endif
input_login.cpp
input_login.cpp:
//#include'ların tanımlandığı yer bittikten sonra bunu ekle:
#ifdef WHITELIST
extern int g_whiteList;
#endif
//bunu bul:
void CInputLogin::LoginByKey(LPDESC d, const char * data) {...}
//ve içindeki
sys_log(0, "LOGIN_BY_KEY: %s key %u", login, pinfo->dwLoginKey);
//satırının üzerine bunu ekle:
#ifdef WHITELIST
if (g_whiteList)
{
char szQuery[512];
snprintf(szQuery, sizeof(szQuery), "SELECT login FROM common.whitelist");
std::unique_ptr<SQLMsg> pMsg(AccountDB::instance().DirectQuery(szQuery));
if (pMsg->Get()->uiNumRows == 0)
{
fprintf(stderr, "WHITELIST: Tabloda hicbir id tanimli degil veya sorgu hatasi : %s\n", szQuery);
LoginFailure(d, "NOWLIST");
return;
}
MYSQL_ROW row;
bool found = false;
sys_log(0, "WHITELIST: GIRIS DENEMESI: -> %s", pinfo->login);
while (NULL != (row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
{
std::string mylogin = row[0];
if (mylogin == pinfo->login)
{
sys_log(0, "WHITELIST: GIRIS SAGLANDI! -> %s", pinfo->login);
found = true;
}
}
if (!found)
{
sys_log(0, "WHITELIST: LISTE DISI -> %s", pinfo->login);
LoginFailure(d, "NOWLIST");
return;
}
}
#endif
service.h
service.h:
//en alta bunu ekle:
#define WHITELIST
Client (pack):
locale/tr/locale_game.txt
root/intrologin.py
locale/tr/locale_game.txt:
LOGIN_FAILURE_WHITELIST Hesabınız whitelist'te tanımlı değil.
root/intrologin.py
root/intrologin.py:
#bunu bul:
self.loginFailureMsgDict={
#....
}
#içine, en alta ekle:
"NOWLIST" : localeInfo.LOGIN_FAILURE_WHITELIST,
#bunu bul:
self.loginFailureFuncDict = { ...... }
#içine, en alta ekle:
"NOWLIST" : self.__DisconnectAndInputPassword,
Kullanım:
Sabit olsun istiyorsanız kanalların CONFIG dosyalarında WHITE_LIST: 1 tokeniyle aktive edebilirsiniz.
Aynı zamanda oyun içinde de GM karakterle /whitelist 1 veya /whitelist 0 komutlarıyla aktive edebilir veya devre dışı bırakabilirsiniz.
Veritabanı common içinde, yukardaki sql dosyasında okuttuğumuz whitelist tablosuna istediğiniz ID'yi ekleyip oyuna giriş izni verebilirsiniz.
Oyun içinde de /addwhitelist kullanıcı_id komutuyla whitelist tablosuna ID ekleyebilirsiniz.