Paylaş :
Bu rehberde oyun içinden belirli bir oyuncunun hesabına EP eklemek için basit bir GM komutu ekliyoruz. Komut mantığı şu şekilde çalışıyor: GM oyunda /ep_g oyuncu_adı miktar komutunu yazıyor, sistem oyuncuyu buluyor ve oyuncunun bağlı olduğu account ID üzerinden account.account tablosundaki coins değerini artırıyor.

Komut örneği:
/ep_g ZacqooLeaven 1881
veya:
/ep_g ZacqooLeaven 1938
Yani kullanım yapısı şu şekilde:
/ep_g oyuncu_adı ep_miktarı
cmd.cpp Düzenlemesi
İlk olarak cmd.cpp dosyasını aç.
Şunu ara:
ACMD(do_block_chat_list);
Altına bunu ekle:
ACMD(do_ep_ver);
Sonra yine cmd.cpp içinde şu satırı bul:
{ "block_chat_list", do_block_chat_list, 0, POS_DEAD, GM_PLAYER },
Altına bunu ekle:
{ "ep_g", do_ep_ver, 0, POS_DEAD, GM_IMPLEMENTOR },
Burada komutu GM_IMPLEMENTOR seviyesine tanımlıyoruz. Çünkü bu komut direkt hesaba EP eklediği için normal GM seviyesine açık bırakılması doğru olmaz. Sadece en yüksek yetkide kullanılması daha güvenli olur.
cmd_gm.cpp Düzenlemesi
Şimdi cmd_gm.cpp dosyasını aç.
Dosyanın en alt tarafına aşağıdaki fonksiyonu ekle:
ACMD(do_ep_ver)
{
char arg1[256], arg2[256];
long cnsvalue;
const char* Name; two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)); if (!*arg1 || !*arg2)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /ep_g oyuncu ep");
return;
} Name = arg1;
cnsvalue = atoi(arg2); if (cnsvalue <= 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "EP miktari 0'dan buyuk olmalidir.");
return;
} LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(Name); if (!tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Oyuncu %s bulunamadi.", Name);
return;
} std::auto_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(
"UPDATE account.account SET coins = coins + %ld WHERE id = %d",
cnsvalue,
tch->GetAID()
)); tch->ChatPacket(
CHAT_TYPE_INFO,
"Administrator %s hesabiniza %ld EP yukledi.",
ch->GetName(),
cnsvalue
); ch->ChatPacket(
CHAT_TYPE_INFO,
"%s isimli oyuncunun hesabina %ld EP yukledin.",
tch->GetName(),
cnsvalue
);
}
Bu haliyle komut sadece oyunda aktif olan oyuncular için çalışır. Çünkü burada oyuncu şu satırla aranıyor:
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(Name);
FindPC sadece oyunda olan karakterleri bulur. Yani oyuncu offline ise sistem oyuncuyu bulamaz ve şu mesajı verir:
Oyuncu bulunamadi.
Eğer oyuncu online ise sistem oyuncunun account ID değerini alır:
tch->GetAID()
Sonra bu account ID ile account.account tablosundaki coins alanını artırır:
UPDATE account.account SET coins = coins + miktar WHERE id = account_id
Komut Kullanımı
Oyuna girip implementor yetkisindeki karakterle şu şekilde kullanabilirsin:
/ep_g ZacqooLeaven 1881
Bu komut ZacqooLeaven isimli oyuncunun hesabına 1881 EP ekler.
Başka bir örnek:
/ep_g TestPlayer 500
Bu da TestPlayer isimli oyuncunun hesabına 500 EP ekler.
İşlem başarılı olursa EP alan oyuncuya şu tarz mesaj gider:
Administrator GM_ADI hesabiniza 500 EP yukledi.
Komutu kullanan GM tarafında da şu tarz mesaj görünür:
TestPlayer isimli oyuncunun hesabina 500 EP yukledin.
Daha Güvenli Kullanım İçin Log Eklemek
Bu tarz komutlarda log tutmak iyi olur. Çünkü direkt hesaba EP ekleyen bir sistem olduğu için daha sonra kimin, kime, kaç EP verdiğini görmek isteyebilirsin.
Fonksiyon içinde SQL işleminden sonra şunu ekleyebilirsin:
sys_log(
0,
"EP_COMMAND: %s gave %ld EP to %s account_id %d",
ch->GetName(),
cnsvalue,
tch->GetName(),
tch->GetAID()
);
Böylece komut kullanıldığında syslog tarafında kayıt oluşur.
Negatif Değer Kontrolü
Orijinal kodda girilen değer direkt atoi ile alınıyor. Bu durumda biri yanlışlıkla negatif değer girerse oyuncunun EP’si düşebilir. Bu yüzden şu kontrolü eklemek önemli:
if (cnsvalue <= 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "EP miktari 0'dan buyuk olmalidir.");
return;
}
Bu kontrol sayesinde /ep_g oyuncu -500 gibi bir kullanım çalışmaz.
std::auto_ptr Notu
Eski Metin2 source yapılarında genelde std::auto_ptr<SQLMsg> kullanılıyor. Eğer source eskiyse bu şekilde kalabilir:
std::auto_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(
"UPDATE account.account SET coins = coins + %ld WHERE id = %d",
cnsvalue,
tch->GetAID()
));
Ama daha güncel C++ kullanan bir source varsa auto_ptr yerine std::unique_ptr tercih edilir. Yine de birçok Metin2 source eski standartla derlendiği için burada auto_ptr kullanımı normal.
Offline Oyuncuya EP Verme Hakkında
Bu komutun mevcut hali sadece online oyuncuya EP verir. Offline oyuncuya da EP vermek istiyorsan karakter adından account ID çekmek için database sorgusu yazmak gerekir. Ama bu ayrı bir sistem sayılır. Çünkü oyuncu online değilse FindPC ile karakter nesnesine ulaşamazsın.
Online oyuncu için bu hali yeterli ve daha basit çalışır.
Kısa Özet
cmd.cpp içine komut tanımı ekleniyor.
cmd_gm.cpp içine do_ep_ver fonksiyonu ekleniyor.
Komut kullanımı:
/ep_g oyuncu_adı ep_miktarı
Oyuncu online ise hesabındaki coins değeri artırılıyor.
Komut sadece GM_IMPLEMENTOR yetkisinde çalışıyor.
Negatif veya sıfır EP girişi engelleniyor.
Log eklenirse kimin kime EP verdiği daha rahat takip edilir.
![[DEV] EMOJİ](https://dev.mmooyun.com/wp-content/uploads/2026/03/cropped-cropped-Gemini_Generated_Image_r2ljj1r2ljj1r2lj-1.png)

[…] GM Paneli ile Bakım Duyurusu Metin2 Gelişmiş Reload Komutları dev.mmooyun.com’da Metin2 Oyuncuya EP Verme Komutu dev.mmooyun.com’da Metin2 Otomatik Av Çoklu-Client External Araç Hakkında Kısa Not Metin2 Advanced Farm Bot […]
[…] KANITLAR […]